javascript - 为什么 {} == {} 为假,但 {} + {} == {} + {} 为真

标签 javascript node.js

为什么在 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/

相关文章:

javascript - node-webkit 和 mysql 查询

javascript - 如何使用 babel-core/register 在 Node.js 中编写 ES6 代码?

node.js - 如何将 package.json 中的每个依赖项更新到最新版本?

javascript - Jest : async test incorrectly passes despite mismatched expect/received values

javascript - 将轮播移动到单击的 div、bxslider

mysql - 如何使用 sequelize 仅在 mysql 中节省时间

node.js - Mongoose avg 函数(按请求字段)

php - 为站点抓取入口域

javascript - 如何编写一个非阻塞的javascript方法?

javascript - (对象)未定义