なぜ node.js は{} == {}と同等なfalseのに と{} + {} == {} + {}同等なのtrueですか?
> {} == {}
false
> {} + {} == {} + {}
true
なぜ node.js は{} == {}と同等なfalseのに と{} + {} == {} + {}同等なのtrueですか?
> {} == {}
false
> {} + {} == {} + {}
true
+これが文字列連結演算子です。これ:
{} == {}
「 で 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]'