【发布时间】:2016-04-11 16:08:49
【问题描述】:
背景资料是:在JavaScript中,float和int没有区别。只有编号,它是 IEEE 754 标准。所以 JavaScript 中不应该有任何“float”和“int”。即使在进行按位运算时将数字视为 32 位整数,结果也应该是 Number。换句话说,不应该有“整数”类型。
但至少在 Google Chrome 和 Node.js 上:
比较2个函数(作为对象的函数):
(-1).toString === (-1 >>> 0).toString // => true
所以它们是相同的、相同的函数对象。事实上,“被包裹的对象”属于同一类型:
(-1).__proto__ === (-1 >>> 0).__proto__ // => true
但是当你使用
(-1).toString(2) // => "-1"
和
(-1 >>> 0).toString(2) // => "11111111111111111111111111111111"
似乎对象包装器(使原始类型 1 成为对象的包装器)将创建具有相同对象类型的两个对象(如 __proto__ 所示),但不知何故,它认为本身不是同一类型,一个是浮点数,一个是 32 位整数。这是为什么?
根据OOP接口通常的一般原则,如果两个对象属于相同类型(相同类型,如__proto__表示相同),它们在响应时不应该给出相同、相同的结果吗?相同的“消息”,即toString(2)?
【问题讨论】:
-
JavaScript 使用单个
Number类型来表示整数和浮点数。但是,来自MDN:移位运算符将其操作数以大端顺序转换为 32 位整数,并且在应用零填充右移时,符号位变为 0,因此结果总是非负数。
标签: javascript oop types interface