2013-07-21 11 views
26

なぜnode.jsがfalseに相当する{} == {}ですが、はtrueに相当しますか?ここなぜ{} == {}が偽ですが、{} + {} == {} + {}が成り立ちます

> {} == {} 
false 
> {} + {} == {} + {} 
true 
+17

関連:[WAT?](http://destroyallsoftware.com/talks/wat)それだけで関心の外に、偽のChromeで –

+2

。 –

+1

@RichBradshawはChromeでテストしませんでした。ノードのみでテストしました。 – 0xAX

答えて

53

+文字列連結演算子です。この:

{} == {} 

は「私は{}で1つの{}を持つオブジェクト、および他のオブジェクトを作成した場合、彼らは同じオブジェクトである?」という意味。答えは「いいえ」です。

この:

{} + {} == {} + {} 

は "原始文字列"[object Object][object Object]"と同じ原始文字列"[object Object][object Object]"ているのですか?" という意味。答えは「はい」です。


を追加するように編集:コメンターの数が(それはない本当のNaN == NaNことをだから){} + {} == {} + {}が実際にfalseを返すように、ChromeのWebコンソールで、{} + {}が数値に加え、NaN + NaNを実行していることを指摘しています。 FirefoxのウェブコンソールはChromeと同じ結果を出しますが、これをページ内で実行するとnode.jsと同じ結果になります

[編集さ:仕様は{} + {}文字列の連結と{} + {} == {} + {}真でなければなりませんしなければならないことを指示する方法の長い説明。説明、正しいながら、以下に挙げる、もはやそれほど面白いです]


編集を追加するには:コメントに感謝をjJ'では、私は今、矛盾のより良い説明を提供することができます。

Webコンソールの動作の理由は、Webコンソールに特に式が必要ないためです。それは喜んでif(true) { }のようなものを受け入れるでしょう。だから、{} + {}を見ると、式として解釈されません。最初の{}はネイキッドブロックとして解釈され、+ {}は式として解釈されます(新しいオブジェクトを作成してプリミティブ番号—に変換します。つまり、NaN —)。 Webコンソールには、最後の式の結果が表示されます(たとえば、入力3; 4は出力4を出力します)。この場合はNaNです。

{} + {} == {} + {}は、同様に、即ち「false続く空きブロック」、すなわち、「NaN == '[object Object][object Object]'続く空きブロック、」、「(+{}) == ({} + {})続く空きブロック」と解釈されます。

これは、かっこを使用して修正できます。 ({} + {} == {} + {})は、たとえば、trueを返します。

(この動作は、Webコンソール固有のものではありません。evaleval('{} + {}')NaNeval('({} + {})')'[object Object][object Object]'であるように、同じルールに従います)

+0

はい、「{object}」の結果が{} + {}から見えました。私はnode.jsで新しく、注意を払っていませんでしたそれはちょうど文字列です、私はそれがノードの内部データ型だと思った:)今は 'typeof({} + {})'が 'string'であることがわかります。素晴らしい答えと説明をありがとう – 0xAX

+0

@ruakh:すばらしい説明! '{} + {} == {} + {}'がchromeとfirefoxで 'false'を返す理由についての考えはありますか? –

+2

@ go-oleg FFの '{} + {}'は 'NaN'です。そして、 'NaN == NaN'はfalseです。なぜなら、** NaNは決してそれ自体と等しくないからです。この説明を参照してください:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FNaN – BlackSheep

関連する問題