25

Why in node.js is {} == {} equivalent to false, but is {} + {} == {} + {} equivalent to true?

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

1 回答 1

52

+这是字符串连接运算符。这个:

{} == {}

意思是“如果我用 来创建一个对象,用 来创建{}另一个对象{},它们是同一个对象吗?”;答案是“不”。

这个:

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

表示“原始字符串是否与原始字符串"[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) { }。因此,当它看到 时{} + {},它不会将其解释为表达式;initial{}被解释为一个裸块,然后 the+ {}被解释为一个表达式(创建一个新对象,将其转换为原始数字 - 即NaN- 并评估为该数字)。Web 控制台显示最后一个表达式的结果(例如,输入3; 4将给出输出4),在本例中为NaN

{} + {} == {} + {},类似地,被解释为“空块,后接(+{}) == ({} + {})”,即“空块,后接NaN == '[object Object][object Object]'”,即“空块,后接false”。

这可以通过使用括号来解决;({} + {} == {} + {}),例如,返回true

(顺便说一下,这种行为并不完全特定于 Web 控制台。eval遵循相同的规则,例如eval('{} + {}')isNaNeval('({} + {})')is '[object Object][object Object]'。)

于 2013-07-21T17:23:57.207 回答