为什么{} + {}在Chrome控制台中不再是NaN?

Fil*_*und 143 javascript google-chrome

我今天注意到NaN当你输入{}+{}控制台时,Chrome 49不再输出.而是输出字符串[object Object][object Object].

为什么是这样?语言有变化吗?

Ber*_*rgi 149

Chrome devtools现在自动将一系列以隐含的括号开头{和结束的内容包装起来}(参见代码),以强制将其评估为表达式.这样,{}现在创建一个空对象.如果你回顾历史(),你可以看到这一点,前一行将包含在(…).

为什么?我不知道,但我可以猜测它可以减少那些不知道block-vs-object-literal事情的新手的混乱,如果你只是想评估一个表达式,它也会更有帮助.

事实上,正如bug 499864中所讨论的那样,这就是推理.纯粹的便利.因为节点REPL也有它(见代码).

  • 愚蠢的Chrome,`{a:1}),({b:2}`应该抛出一个错误,而不是产生一个对象. (182认同)
  • 当您用正则表达式解析任意深度嵌套结构时会发生这种情况/sf/ask/121264391/ (29认同)
  • 我不明白为什么,但不知怎的,当我在那里看到我的消息时,我觉得"很有名",尽管那个页面和这个一样公开:D奇怪的StackOverflow问题.这是关于这个问题的旧答案http://stackoverflow.com/questions/17268468/why-is-nan-only-on-the-client-side-why-not-in-node-js/17269376#17269376 (4认同)
  • 错误报告和代码示例的好发现! (3认同)
  • 我不喜欢当前的实现并计划修复它.https://bugs.chromium.org/p/chromium/issues/detail?id=499864#c17 (3认同)

J. *_*tus 44

如果在检查完之后点击向上箭头,您会注意到{} + {}它显示而不是显示({} + {}),这导致了"[object Object][object Object]".

相比之下,在Firefox中{} + {}仍然显示NaN,但如果你这样做({} + {})也会显示"[object Object][object Object]".

因此,看起来Chrome在看到此操作时会自动添加周围的括号.

  • @ 0x499602D2:因为除非你做了parens(否则会导致解析器转向期望表达式而不是语句),初始的`{}`只是一个空的代码块而被忽略,留给我们`+ {}` ,这是一个一元的`+`和一个空的对象初始化器.`+`会强制它的参数为number,这涉及将对象转换为一个原语(在这种情况下最终会成为`toString`,导致``[object Object]"`),所以我们得到`+ "[object Object]"```NaN`,因为``[object Object]"`无法转换为有效数字. (25认同)
  • 这个答案是对的.但哇,伙计,我不确定我喜欢铬那样做.糟糕的谷歌. (22认同)
  • `{} + {}`当没有"清理"到`({} + {})时`被视为`+ {}`因为`{}`被解析为空块. (8认同)
  • 为什么它会首先归还NaN? (7认同)