为什么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报价。 控制台没有提供关于它为你做了什么的信息。
新的规则非常简单 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]"
疯狂和一致我可以处理…疯狂和不一致的不谢谢你!