我今天注意到当您在控制台中输入NaN
时,Chrome 49不再输出{}+{}
。而是输出字符串[object Object][object Object]
。
这是为什么?语言有变化吗?
答案 0 :(得分:149)
Chrome devtools现在会自动将所有以{
开头并以}
结尾的内容包装在一对隐含的括号(see code)中,以强制将其评估为表达式。这样,{}
现在就创建了一个空对象。如果您回顾历史记录(↑),您可以看到这一点,前一行将包含在(…)
中。
为什么呢? 我不知道,但我猜它可以减少那些不知道块与对象字面意义的新手的混淆,而且它还有更多如果你只是想评估一个表达式,那就很有帮助。
事实上,正如bug 499864中所讨论的那样,这就是推理。纯粹的便利。因为node REPL had it也是如此(see code)。
答案 1 :(得分:44)
如果您在选中后点击向上箭头,则会注意到{} + {}
代替({} + {})
而不是"[object Object][object Object]"
,这会产生{} + {}
。
相比之下,在Firefox中,NaN
仍会显示({} + {})
,但如果您"[object Object][object Object]"
,则会显示{{1}}。
因此,看起来Chrome会在看到此操作时自动添加周围的括号。
答案 2 :(得分:4)
不幸的是,我自己添加了Clippy的报价。控制台没有提供有关它为您做了什么的信息。
新规则令人难以置信的简单使我们省去了在将对象文字粘贴到控制台之前费力地键入这两个难以理解的字符o=
或0,
的麻烦:
{
; {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
我不明白为什么他们把价值包裹在parens中。 JS有一些荒谬的设计决定,但试图让它在这种情况下表现更好并不是一个真正的选择,控制台需要正确运行JS,我们需要确信chrome不仅仅是猜测它认为我们真的想要做其他事情。
如果您不喜欢逗号操作符,则可以使用赋值
x = {foo:1}.foo
因为它本身就是
{} + {} + {}
"[object Object][object Object][object Object]"
;{} + {} + {}
"NaN[object Object]"
我可以处理疯狂和一致......疯狂和不一致不谢谢!