http://wtfjs.com/の最近の投稿。作者は説明なしで次のように書いていますが、それはたまたま真実です。
0 === -0 //returns true
===演算子についての私の理解は、オペランドが同じオブジェクトを指している場合はtrueを返すということです。
また、-演算子はオペランドの負の値への参照を返します。このルールでは、0と-0は同じであってはなりません。
では、なぜ0 === -0なのですか?
http://wtfjs.com/の最近の投稿。作者は説明なしで次のように書いていますが、それはたまたま真実です。
0 === -0 //returns true
===演算子についての私の理解は、オペランドが同じオブジェクトを指している場合はtrueを返すということです。
また、-演算子はオペランドの負の値への参照を返します。このルールでは、0と-0は同じであってはなりません。
では、なぜ0 === -0なのですか?
===
必ずしも同じオブジェクトを指すとは限りません。オブジェクトでは実行されますが、値型では値を比較します。したがって、これがどのように機能するか:
var x = 0;
var y = 0;
var isTrue = (x === y);
document.write(isTrue); // true
JavaScriptはIEEE浮動小数点標準を使用しました。0と-0は2つの異なる数値ですが、ECMAScript標準では、パーサーは0と-0を同じものとして解釈する必要があると規定されています。
§5.2(12ページ)
加算、減算、否定、乗算、除算、およびこの節の後半で定義される数学関数などの数学演算は、無限大を含まず、負のゼロを含まない数学実数で正確な数学結果を計算するものとして常に理解する必要があります。正のゼロとは区別されます。浮動小数点演算をモデル化するこの標準のアルゴリズムには、必要に応じて、無限大と符号付きゼロを処理し、丸めを実行するための明示的なステップが含まれています。数学演算または関数が浮動小数点数に適用される場合、それはその浮動小数点数によって表される正確な数学値に適用されると理解されるべきです。そのような浮動小数点数は有限でなければならず、もしそうなら+0または-0の場合、対応する数学値は単純に0です。
実際、0と-0はビットレベルでも同じではありません。ただし、+ /-0に実装された特殊なケースがあるため、同等と比較されます。
===演算子は、プリミティブ数に適用されると値で比較されます。
プリミティブ番号はオブジェクトではありません。オブジェクトのID比較ではなく、数値の値比較を行っています。
正のゼロは負のゼロと同じです。
これは、===
オペレーターの比較アルゴリズムによるものです
Type(x)がNumberの場合、
xがNaNの場合、falseを返します。
yがNaNの場合、falseを返します。
xがyと同じ数値である場合、trueを返します。
xが+0でyが-0の場合、trueを返します。
xが-0で、yが+0の場合、trueを返します。
falseを返します。