2012-08-17 19 views
7

http://wtfjs.com/の最近の投稿です。著者は説明のないまま次のことを真実にする。JavaScriptで「0 === -0」がtrueになるのはなぜですか?

0 === -0 //returns true 

===演算子については、オペランドが同じオブジェクトを指す場合はtrueを返します。

また、 - 演算子は、オペランドの負の値への参照を返します。このルールでは、0と-0は同じであってはなりません。

なぜ、0 === -0ですか?

答えて

5

実際、ビットレベルでも0と-0は同じではありません。しかし、+/- 0のために特別なケースが実装されているため、それらは等価として比較されます。

===演算子は、プリミティブ番号に適用すると値で比較します。

+0

それは同じものではなく、2つあります。 –

+0

@ColeJohnson少し補完するのを忘れてしまった。 JavascriptはIEEE 64ビットの浮動小数点を数値に使用します。これは1の補数です。 –

+0

JavaScriptでは特殊な扱いになっているようです。 – riship89

6

===は必ずしも同じオブジェクトを指しているわけではありません。これはオブジェクト上で行いますが、値型では値を比較します。したがって、これはどのように機能するか:JavaScriptが0と-0は、2つの異なる数値であるIEEE浮動小数点標準を使用

var x = 0; 
var y = 0; 
var isTrue = (x === y); 
document.write(isTrue); // true 

、しかし、ECMAScript standard状態は、パーサは0を解釈しなければなりません-0同じよう:

§5.2

この節で後で定義する加算、減算、否定、乗算、除算、数学関数などの数学演算は、数学的実数の正確な数学的結果を計算するものとして常に理解する必要があります。無限を含まず、には、正のゼロと区別される負のゼロが含まれません。浮動小数点演算をモデル化するこの標準のアルゴリズムには、必要に応じて、無限大と符号付きゼロを処理して丸めを実行する明示的な ステップが含まれています。算術演算または関数が浮動小数点数に適用される場合、それはその浮動小数点数で表される正確な数学値に適用されるものとして理解されるべきである。そのような浮動小数点数は有限でなければならず、+0または-0の場合、対応する数学値は単に0です。

+0

ので、それは2の補数を使用して評価されたJavaScriptまたは負の数で実装特殊なケースですか? – riship89

+0

@ hrishikeshp19 IEEE浮動小数点標準はこれを補完するものです。 –

+0

パーサーだけではありません。 'a === -a'は、aが0のときにtrueを返します。 –

3

プリミティブ番号はオブジェクトではありません。数値の値の比較を行い、オブジェクトのアイデンティティの比較ではありません。

正のゼロは負のゼロに等しい。

これは

===オペレータに対して比較アルゴリズムであるタイプ(X)の数である場合、xがNaNである場合、

  • 、falseを返します。

  • yがNaNの場合はfalseを返します。

  • xがyと同じ数値の場合はtrueを返します。

  • xが+0でyが-0の場合はtrueを返します。

  • xが-0でyが+0の場合はtrueを返します。

  • falseを返します。

+2

+1。 -0は実際にはJavaScriptの数値なので(負のゼロを表すことができるIEEE-754浮動小数点数のすべての数が実際に存在するためです)。人々は狂っていないので、0に等しいと定義されています。 –

関連する問題