25

なぜ node.js は{} == {}と同等なfalseのに と{} + {} == {} + {}同等なのtrueですか?

> {} == {}
false
> {} + {} == {} + {}
true
4

1 に答える 1

52

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

{} == {}

「 で 1 つのオブジェクトを作成し{}、 で別のオブジェクトを作成した場合{}、それらは同じオブジェクトですか?」; 答えは「いいえ」です。

これ:

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

"[object Object][object Object]"「プリミティブ文字列はプリミティブ文字列と同じ"[object Object][object Object]"ですか?」を意味します。そして答えは「はい」です。


追加するように編集:{} + {} Chrome の Web コンソールでは、が数値の加算を実行NaN + NaNし、 が{} + {} == {} + {}実際に返されることを多くのコメント作成者が指摘していますfalse(それは真実ではないためNaN == NaN)。Firefox の Web コンソールは Chrome と同じ結果になりますが、これをページ内で実行すると、node.js と同じ結果になります。

[編集済み: 仕様がどのように文字列連結である{} + {} べきか、真である{} + {} == {} + {} べきかについての長い説明。説明は正しいものの、以下を考えると、もはやそれほど興味深いものではありません.]


追加するために編集: jJ'によるコメントのおかげで、矛盾についてより良い説明を提供できるようになりました。

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

{} + {} == {} + {}、同様に、「空のブロックの後に」、つまり「空のブロック(+{}) == ({} + {})の後にNaN == '[object Object][object Object]'」、つまり「空のブロックの後に」と解釈されfalseます。

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

(ちなみに、この動作は Web コンソールに完全に固有のものではありません。isやisevalなど、同じ規則に従います。)eval('{} + {}')NaNeval('({} + {})')'[object Object][object Object]'

于 2013-07-21T17:23:57.207 に答える