なぜ 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('{} + {}')
NaN
eval('({} + {})')
'[object Object][object Object]'