我今天注意到,NaN
当您输入{}+{}
控制台时,Chrome 49不再输出。而是输出字符串[object Object][object Object]
。
为什么是这样?语言改变了吗?
现在,Chrome devtools会自动在隐含的一对括号(请参阅代码)中包装所有以开头{
和结尾的内容,以强制将其评估为表达式。这样,现在创建一个空对象。如果您回顾历史记录(),则会看到此内容,前一行将包含在中。}
{}
↑(…)
为什么?我不知道,但是我可以猜到它可以减少不知道block-vs-object-literal内容的新手的困惑,如果您只想计算一个表达式,它也将更加有用。
实际上,这就是原因,如错误499864中所述。纯粹的方便。而且因为节点REPL也具有它(请参见代码)。
如果选中此选项后单击向上箭头,则会注意到而不是{} + {}
显示({} + {})
,结果为"[object Object][object Object]"
。
相比之下,在Firefox中,{} + {}
仍会显示NaN
,但是如果您这样做({} + {})
,也会显示"[object Object][object Object]"
。
因此,当Chrome浏览器看到此操作时,它似乎会自动添加周围的括号。
从Chrome 54开始,关于控制台:
不幸的是,我自己添加了Clippy报价。控制台不会提供有关为您完成的操作的信息。
新规则非常简单,为我们省去了繁琐地键入这两个困难字符o=
或0,
在将对象文字粘贴到控制台之前的麻烦:
- 如果您的代码以以下内容开头:可选的空格,(不允许使用任何注释),后跟一个
{
; - 该代码可以解释为一个对象;
- 并且该对象后面没有其他代码,除非:
- 第一个对象之后的代码是二进制运算符,
- 那么您可以根据需要进行任意操作,包括分组
- 如果最终运算符在右侧位置具有Object文字;
- 并且该最终对象尚未在括号中分组
- 并且该代码不以分号终止
- 并且代码后没有注释(内部注释是允许的,只要它们不在初始位置或最终位置即可)
- 然后,只有这样,您的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]
下一个被正确地解释为一个对象,用a冲进表达式位置,0,
这通常是我们明确地确保我们拥有表达式而不是语句的方式。
0,{foo:1}.foo
我不明白他们为什么将这些值包装在括号中。JS做出了一些荒谬的设计决策,但是要使它在这种情况下表现得更好并不是真正的选择,控制台需要正确运行JS,我们需要确信chrome并不仅仅是在猜测它认为我们真的意味着要做其他事情。
如果您不喜欢逗号运算符,则可以使用赋值
x = {foo:1}.foo
因为目前
{} + {} + {}
"[object Object][object Object][object Object]"
;{} + {} + {}
"NaN[object Object]"
疯狂而始终如一的我可以处理...疯狂而又前后不一的谢谢!
文章标签:google-chrome , javascript
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!