今天我注意到,当你在控制台中键入 {}+{}时,Chrome49不再输出 NaN。相反,它输出字符串 [object Object][object Object]。
{}+{}
NaN
[object Object][object Object]
为什么会这样,语言变了吗?
如果在检查之后点击向上箭头,您会注意到它显示的是 ({} + {})而不是 {} + {},这导致了 "[object Object][object Object]"。
({} + {})
{} + {}
"[object Object][object Object]"
相比之下,在 Firefox 中,{} + {}仍然显示 NaN,但是如果显示 ({} + {}),它也会显示 "[object Object][object Object]"。
所以,看起来 Chrome 在看到这个操作时自动添加了周围的括号。
Chrome devtools 现在自动将以 {开头和以 }结尾的所有内容包装在一对隐式括号(看代码)中,以强制将其求值作为一个表达式。这样,{}现在创建一个空对象。如果回顾历史(↑) ,您可以看到这一点,前一行将包含在 (…)中。
{
}
{}
(…)
为什么?我不知道,但是我猜它可以减少那些不知道 block-vs-object-Literal 的新手的困惑,如果你只是想计算一个表达式,它也会更有帮助。
事实上这就是原因,就像在 窃听器499864中讨论的那样。纯粹是为了方便。而且因为 节点 REPL 拥有它也是(看代码)。
不幸的是,我自己添加了 Clippy 引用。控制台没有提供任何关于它为您做了什么的信息。
新的规则是令人难以置信的 很简单省去了我们在粘贴 Object Literals 到控制台之前费力地输入这两个困难字符 o=或 0,的麻烦:
o=
0,
{wat:1}),({wat:2}终于又出错了。
{wat:1}),({wat:2}
最后,正确地允许使用 {let i=0;var increment=_=>i++},这是一种非常好的闭包方式。
{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]"
疯狂和始终如一的我可以处理... 疯狂和不一致的没有谢谢你!