为什么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]"

疯狂和一致我可以处理…疯狂和不一致的不谢谢你!