2012-02-26 9 views
4

が、私は最新のクローム(17.0.963.56)におよびFirefox 7.0でMac上で次のように再現しました:underscore.jsのネガ:なぜ_isEqual(0、-1 * 0)がfalseを返すのですか? JavaScriptライブラリ<a href="http://underscorejs.org" rel="nofollow">underscore.js</a>(v.1.3.1)を使用して

0 === -1 * 0 
> true 

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

をこれがあります少なくとも私にとっては驚くべきことです。私は、===が真である2つの値が_.isEqualも真実になると予想しました。

ここでは何が起こっていますか?ありがとう!これは、明示的in the sourceを入れてきた

答えて

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-0differentlyを解釈していますが、通常は0 == -00 === -0ので、これは表示されません。その差異を確認するにはa few waysしかありません。

+0

ありがとうございます! '==='はいつも私の要求によく似ているので、私には明らかではない設計の決定のようです。しかし、私は考えを得る。 – brahn

3

eqファンクションhereのソースを参照してください。 -1 * 00ではなく-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のため、これは気付かないのです。

関連する問題