为什么Chrome控制台中的{} + {}不再是NaN?
我今天注意到,当您在控制台中input{}+{}时,Chrome 49不再输出NaN 。 而是输出string[object Object][object Object] 。 
为什么是这样? 语言是否改变?
  Chrome开发工具现在自动将以{开始并以}结尾的所有内容包含在一对隐含的括号( 请参阅代码 )中,以强制其评估为expression式。 这样, {}现在创build一个空对象。 如果你回顾历史( ↑ ),你可以看到这一点,上一行将被包含在(…) 。 
 为什么?  我不知道,但我可以猜测,这样做可以减less对不知道块对比对象字面量事物的新手的困惑,而且如果您只是要评估一个expression式,这也会更有帮助。 
事实上这就是错误499864中讨论的原因 。 纯粹的方便。 而且因为节点REPL也有它 ( 见代码 )。
 如果在检查完成后点击向上箭头,则会注意到{} + {}会显示({} + {}) ,导致出现"[object Object][object Object]" 。 
 相比之下,在Firefox中, {} + {}仍然显示NaN ,但是如果您这样做({} + {})它也会显示"[object Object][object Object]" 。 
所以,看起来Chrome浏览器在看到这个操作时会自动添加左边的括号。
从Chrome 54到控制台:
  不幸的是,我自己添加了Clippy报价。  控制台没有提供关于它为你做了什么的信息。
  不幸的是,我自己添加了Clippy报价。  控制台没有提供关于它为你做了什么的信息。 
 新的规则非常简单 0,在将Object Literals粘贴到控制台之前0,为我们省去了麻烦地inputo=或0,这两个困难字符的麻烦: 
-  如果您的代码以下列选项开头:可选的空格,(不允许有任何注释),后跟一个{;
- 而且这个代码可以被解释为一个对象;
- 并且该对象之后没有其他代码,除非:
- 第一个对象之后的代码是二元运算符,
- 那么可以进行尽可能多的操作,包括分组
- 只要最终的操作符在右手位置有一个对象字面值;
- 而最终的对象并没有被分组在parens中
- 并且该代码不以分号结尾
- 代码后面没有任何评论(只要内部评论不在初始或最终位置,就可以进行内部评论)
- 那么只有这样,你的JavaScript(可能实际上也可能不是真正有效的代码)才会作为一个有效的对象被重新引入。 您不会被告知您的代码已被重新解释。
  {wat:1}),({wat:2}终于再次出错了。 
  {let i=0;var increment=_=>i++}被正确的允许,最后,这是一个非常好的closures方式。 
但是,以下是不正确的一个对象,这只是作为@Bergi提到的便利,它解释JS错误来帮助你! 规范说这是一个带有标签语句“foo”的块,其文字1不被分配给任何东西。
 {foo:1} 
以上应该是一样的
 if(1) { foo: 1 } 
以下内容被正确对待,因为它在它前面有一个注释!
 //magic comment {foo:1} 
那么这是:
 {foo:1} //also magic 
这是一个对象:
 {foo: //not so magic comment 1} 
这是一个错误
 //not so magic comment {foo:1}.foo 
那么这是:
 {foo:1}.foo 
这可以:
 1..wat 
 undefined 
所以是这样的:
 ['foo'][0] 
 下一个被正确解释为一个敲入0,expression式位置的对象0,这通常是我们如何明确地确保我们有一个expression式而不是一个语句。 
 0,{foo:1}.foo 
我不明白他们为什么把这个价值包装在parens里。 JS有一些荒谬的devise决定,但试图让它在这种情况下performance得更好并不是一个真正的select,控制台需要正确运行JS,我们需要确信chrome不只是猜测它认为我们真的意味着要做其他事情。
如果您不喜欢逗号运算符,则可以使用赋值
 x = {foo:1}.foo 
因为如此
 {} + {} + {} 
 "[object Object][object Object][object Object]" 
 ;{} + {} + {} 
 "NaN[object Object]" 
疯狂和一致我可以处理…疯狂和不一致的不谢谢你!