underscore.js中的否定:为什么_isEqual(0,-1 * 0)返回false?

时间:2012-02-26 16:33:05

标签: javascript integer underscore.js

使用javascript库underscore.js(v.1.3.1),我在Mac上以最新的Chrome(17.0.963.56)和Firefox 7.0重现了以下内容:

0 === -1 * 0
> true

_.isEqual(0, -1 * 0)
> false

令人惊讶的是,至少对我而言。我预计===为真的两个值会导致_.isEqual也为真。

这里发生了什么?谢谢!

3 个答案:

答案 0 :(得分:4)

已明确提出in the source

function eq(a, b, stack) {
  // Identical objects are equal. `0 === -0`, but they aren't identical.
  // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
  if (a === b) return a !== 0 || 1 / a == 1 / b;

事实上,JavaScript确实解释了0-0 differently,但您通常看不到这一点,因为0 == -00 === -0。只有a few ways来检查差异。

答案 1 :(得分:3)

查看eq函数here的来源。根据{{​​1}},-1 * 0-0,而不是0,因此0-0不相等。

相关行:

isEqual

之前我确实知道过这件事,但它会为一些有趣的邪恶代码做出准备。

答案 2 :(得分:2)

它比那更深。 JavaScript使用IEEE双精度浮点数,它们对0和-0有不同的表示(当你处理限制时这可能很重要)。但通常你没有注意到这一点,因为0 === -0。