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

今天我注意到,当你在控制台中键入 {}+{}时,Chrome49不再输出 NaN。相反,它输出字符串 [object Object][object Object]

为什么会这样,语言变了吗?

13627 次浏览

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

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

所以,看起来 Chrome 在看到这个操作时自动添加了周围的括号。

Chrome devtools 现在自动将以 {开头和以 }结尾的所有内容包装在一对隐式括号(看代码)中,以强制将其求值作为一个表达式。这样,{}现在创建一个空对象。如果回顾历史() ,您可以看到这一点,前一行将包含在 (…)中。

为什么?我不知道,但是我猜它可以减少那些不知道 block-vs-object-Literal 的新手的困惑,如果你只是想计算一个表达式,它也会更有帮助。

事实上这就是原因,就像在 窃听器499864中讨论的那样。纯粹是为了方便。而且因为 节点 REPL 拥有它也是(看代码)。

至于 Chrome 54的控制台:

📎-"I converted that block to an Object for you" -Clippy 不幸的是,我自己添加了 Clippy 引用。控制台没有提供任何关于它为您做了什么的信息。

新的规则是令人难以置信的 很简单省去了我们在粘贴 Object Literals 到控制台之前费力地输入这两个困难字符 o=0,的麻烦:

  • 如果您的代码以: 可选的空格开始,(不允许注释)后跟 {;
  • 代码可以被解释为一个对象;
  • 该对象后面没有其他代码,除非:
  • 第一个对象后面的代码是二进制运算符,
  • 然后可以有任意多的操作,包括分组
  • 只要最后一个运算符在右边的位置有一个 Object 文字;
  • 最后一个 Object 没有用括号分组
  • 并且该代码不以分号结束
  • 代码后面没有注释(允许内部注释,只要它们不在最初或最终位置)
  • 然后,也只有这样,您的 JavaScript (可能是有效的代码,也可能不是有效的代码)才会被重新解释为有效的 Object。您将不会被告知您的代码已被重新解释。

{wat:1}),({wat:2}终于又出错了。

最后,正确地允许使用 {let i=0;var increment=_=>i++},这是一种非常好的闭包方式。

但是,以下是一个错误的对象,这正如@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,进入表达式位置的对象,这通常是我们如何明确地确保我们有一个表达式而不是一个语句的方法。

0,{foo:1}.foo

我不明白为什么要用括号来包装值。JS 有一些荒谬的设计决定,但是在这种情况下让它表现得更好并不是一个真正的选择,控制台需要正确地运行 JS,我们需要确信 chrome 不仅仅是猜测我们真的想让它做其他的事情。

如果你不喜欢逗号运算符,你可以使用赋值

x = {foo:1}.foo

因为现在看来

{} + {} + {}

"[object Object][object Object][object Object]"

;{} + {} + {}

"NaN[object Object]"

疯狂和始终如一的我可以处理... 疯狂和不一致的没有谢谢你!