在underscore.js中为什么_isEqual(0,-1 * 0)返回false?这涉及到负数的处理。

4
使用Javascript库underscore.js(版本1.3.1),我已在最新版本的Chrome(17.0.963.56)和Firefox 7.0上复制了以下内容:
0 === -1 * 0
> true

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

这让我很惊讶,至少对我来说是这样。我原以为两个值如果使用===相等,那么使用_.isEqual也会相等。

这是怎么回事?谢谢!

3个回答

4

在源代码中明确说明了:

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不同,但通常你看不到这一点,因为0 == -00 === -0。只有少数几种方法可以检查它们的差异。

谢谢!这对我来说似乎是一个非明显的设计决策,因为 === 几乎总是能很好地满足我的需求。但我理解这个想法。 - brahn

3
请查看此处eq函数源代码。在JavaScript中,-1 * 0等于-0而不是0,因此根据isEqual函数,0-0并不相等。

相关代码:

// 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;

我之前知道这个,但它会成为一些有趣的恶意代码。


2

它比这更深刻。JavaScript使用IEEE双精度浮点数,而它们对于0和-0有不同的表示方式(当你处理极限等情况时这可能很重要)。但通常情况下,你不会注意到这一点,因为0 === -0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接