为什么node.js的{} == {}
等同于false
,但{} + {} == {} + {}
等同于true
?
> {} == {}
false
> {} + {} == {} + {}
true
答案 0 :(得分:53)
+
这里是字符串连接运算符。这样:
{} == {}
表示"如果我用{}
创建一个对象,另一个用{}
创建对象,它们是同一个对象吗?&#34 ;;答案是" no"。
此:
{} + {} == {} + {}
表示"是原始字符串"[object Object][object Object]"
与原始字符串"[object Object][object Object]"
相同?&#34 ;;答案是"是"。
已编辑添加:许多评论者指出,在Chrome的网络控制台中,{} + {}
会执行数字添加NaN + NaN
,以便{{1}实际上返回{} + {} == {} + {}
(因为它不是false
)。 Firefox的Web控制台提供与Chrome相同的结果,但是如果您在页面内运行它,它会提供与node.js相同的结果。
[已编辑:详细说明规范如何规定NaN == NaN
应该字符串连接,而{} + {}
应该为真;如果正确的话,解释不再是非常有趣的,如下所示。]
编辑添加:感谢jJ'的评论,我现在可以更好地解释这种不一致。
Web控制台行为的原因是Web控制台并不特别需要表达式;它会很乐意接受像{} + {} == {} + {}
这样的东西。因此,当它看到if(true) { }
时,它并不将其解释为表达式;初始{} + {}
被解释为裸块,然后{}
被解释为表达式(创建一个新对象,将其转换为原始数字 - 即+ {}
- 并评估为数)。 Web控制台显示最后一个表达式的结果(例如,输入NaN
将给出输出3; 4
),在这种情况下为4
。
NaN
被解释为"空块,然后是{} + {} == {} + {}
",即"空块,然后是(+{}) == ({} + {})
& #34;,即"空块,然后是NaN == '[object Object][object Object]'
"。
这可以通过使用括号来解决;例如,false
会返回({} + {} == {} + {})
。
(顺便说一下,此行为并非完全针对Web控制台。true
遵循相同的规则,因此eval
为eval('{} + {}')
且NaN
为eval('({} + {})')
。)