2012-06-21 13 views
12

私はhttp://zero.milosz.ca/に最初のテーブルを見て、そしてなぜ、例えば、0 == []0 != {}を理解したかったです。私はそれがNumber([]) == 0Number({}) == NaNであると仮定しています。しかし、その部分は恣意的と思われます。なぜ空リストが0で、空のオブジェクトがNaNですか? Number(some_object)を使用してJavascriptでNumber([])=== 0とNumber({})=== NaNはなぜですか?

+3

配列が奇妙です。 '[[[[[[123]]]]]]] == 123'のように。 –

+0

@Kolink ...しかし、これが動作する原因は何ですか? (何のルール '=='、 '===、適用されている'では見られない?) –

+4

@Kolink:あなたは*その*奇妙な呼び出し? [+] [+] [+] [+] [+] [+] [+] [+] [+] [ [+] [+] [+] [+] [+] [+] [+] [!] === '失敗'](http://wtfjs.com/2010/07/) – ThiefMaster

答えて

16

は、指定されたオブジェクトの文字列表現を使用します。あなたの例については、文字列表現は、次のとおりです。

js> ({}).toString(); 
[object Object] 
js> [].toString(); 

js> 

'[object Object]'は数が、空の文字列''缶に変換できない文字列。 ThiefMasterの答えに少し詳しく説明し

+1

しかし、なぜ空の文字列 ''''が0に変換されていますか? – tskuzzy

+2

数字の文脈で使用されるとき、偽の値が0に変換されることはかなり一般的です。空のオブジェクトは途中で偽物ではありません。 – ThiefMaster

+6

@tskuzzy:このように定義されているため:* "StringNumericLiteral ::: [空]のMVは0です。" *。 http://es5.github.com/#x9.3.1 –

9

、私はECMAScriptののspecificationsに外観を撮影した:

数に文字列を変換する場合、文法を変換するために使用されています。特に、StringNumericLiteral ::: [empty]の数学的な値は0と定義されます。実際には、空白は0です。

+3

を参照してください。PDFでこれを検索するのが面倒な人のために、http://es5.github.com/#x9.3.1は、仕様。 – ThiefMaster

+0

ありがとう、私は公式HTMLバージョンとのリンクを更新しました。 – tskuzzy

2

一方の値がオブジェクト([]、{})で、もう一方が数値または文字列の場合、演算子==は組み込みの変換方法を使用してオブジェクトをプリミティブ値(この場合は数値)に変換しますこれはJavaScriptですべてのオブジェクト継承:のtoString()のvalueOf()。 {}のような一般的なオブジェクトの場合

のvalueOfが使用され、デフォルトでは、のtoStringが使用され、内蔵アレイの場合!= 0

であり、オブジェクト自体を返します。このメソッドを配列に適用すると、すべての要素がカンマで結合された文字列が返されます。空の配列の場合、空の文字列 ''を返します。

その後、インタプリタがその文字列にのvalueOfを適用します。このメソッドの空の文字列の戻り値は0なので、[] == 0となります。

関連する問題