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

时间:2016-04-05 22:14:19

标签: javascript google-chrome

我今天注意到当您在控制台中输入NaN时,Chrome 49不再输出{}+{}。而是输出字符串[object Object][object Object]

这是为什么?语言有变化吗?

3 个答案:

答案 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)

从Chrome 54到控制台:

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

新规则令人难以置信的简单使我们省去了在将对象文字粘贴到控制台之前费力地键入这两个难以理解的字符o=0,的麻烦:

  • 如果您的代码以以下内容开头:可选空格,(不允许评论)后跟{;
  • 并且该代码可以解释为对象;
  • 并且该对象后面没有其他代码,除非:
  • 第一个对象之后的代码是二元运算符
  • 然后可以包含任意数量的操作,包括分组
  • 如果最终运算符在右手位置有一个Object文字;
  • 并且最终的对象尚未分组为parens
  • 并且该代码不以分号结尾
  • 并且代码后面没有注释(只要内部注释不在初始或最终位置,就允许内部注释)
  • 然后只有那时你的JavaScript(可能或可能不是真正的有效代码)将被重新作为有效的对象。您将不会被告知您的代码已被重新​​解释。

{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]"

我可以处理疯狂和一致......疯狂和不一致不谢谢!