为什么在 node.js 中 {} == {}
等价于 false
,但是是 {} + {} == {} + {}
等价于 true
?
> {} == {}
false
> {} + {} == {} + {}
true
最佳答案
+
这里是字符串连接运算符。这个:
{} == {}
表示“如果我用 {}
创建一个对象,用 {}
创建另一个对象,它们是同一个对象吗?”;答案是“不”。
这个:
{} + {} == {} + {}
意思是“原始字符串”[object Object][object Object]”
和原始字符串“[object Object][object Object]”
一样吗? ";答案是"is"。
已编辑添加:许多评论者指出,在 Chrome 的 Web 控制台中,{} + {}
执行数字加法,NaN + NaN
,使得 {} + {} == {} + {}
实际上返回 false
(因为 NaN == NaN
)。 Firefox 的 Web 控制台提供与 Chrome 相同的结果,但如果您在页面内运行它,它会提供与 node.js 相同的结果。
[已编辑:详细说明规范如何规定 {} + {}
应该 是字符串连接和 {} + {} == {} + {}
应该为真;这个解释虽然是正确的,但已经不再是非常有趣了,如下所示。]
编辑添加:感谢 jJ' 的评论,我现在可以更好地解释不一致之处。
Web 控制台行为的原因是 Web 控制台没有特别要求表达式;它会很乐意接受 if(true) { }
之类的内容。因此,当它看到 {} + {}
时,它不会将其解释为表达式;初始 {}
被解释为裸 block ,然后 + {}
被解释为表达式(创建一个新对象,将其转换为原始数字 - 即 NaN
— 并评估为该数字)。 Web 控制台显示最后一个表达式的结果(例如,输入 3; 4
将给出输出 4
),在本例中为 NaN
.
{} + {} == {} + {}
同样被解释为“空 block ,后跟 (+{}) == ({} + {} )
”,即“空 block ,后跟NaN == '[object Object][object Object]'
”,即“空 block ,后跟false
”。
这可以通过使用括号来解决; ({} + {} == {} + {})
,例如,返回 true
。
(顺便说一下,这种行为并不完全特定于 Web 控制台。eval
遵循相同的规则,例如 eval('{} + {}')
是 NaN
并且 eval('({} + {})')
是'[object Object][object Object]'
。 )
关于javascript - 为什么 {} == {} 为假,但 {} + {} == {} + {} 为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17774886/