数字经过特殊处理。如果它们的位模式相同,那么它们一定是相同的(尽管这是否包括不同版本的 NaN 仍然存在争议)。
主要原因是期望、内部细节泄露和效率。
期望:用户期望数字相同。 x == y(对于两个整数)但不相同(x,y),这违背了常识。
内部细节泄露:VM使用SMI(SMall Integers)来表示特定范围内的整数(32位机器上为31位,64位机器上为63位)。这些都是规范化的并且总是相同的。公开此内部实现细节会导致结果不一致,具体取决于您运行的平台。
效率:虚拟机希望尽可能地对数字进行拆箱。例如,在方法内部,双精度数经常被移入寄存器。然而,跟踪原始盒子可能既麻烦又困难。
foo(x, y) {
var result = x;
while(y-- > 0) {
result += x;
}
return result;
}
假设虚拟机优化了这个函数并移动result
进入寄存器(拆箱x
正在进行中)。这允许一个紧密的循环,其中result
然后进行有效修改。困难的情况发生了,当y
是 0。循环不会执行并且foo
会回来x
直接地。换句话说,以下条件必须为真:
var x = 5.0;
identical(x, foo(x, 0)); // should be true.
如果 VM 已拆箱result
方法中的变量foo
它需要为它分配一个新的盒子result
和identical
因此调用将返回false
.
通过修改定义identical
所有这些问题都可以避免。它的成本很小identical
不过,检查一下。