try{
{a:1}
}
catch(e){}
try{
a:1
}
catch(e){}
上述块的输出在chrome控制台中为"1"。为什么?
这两个代码块都不包含对象文字。
在这两种情况下,a:1
都被解释为标签a
,后面跟着一个仅为1
的语句。
除非在break
或continue
语句中使用标签a
,否则它不会执行任何操作。
类似地,作为一个语句的1
除了返回其值之外也不做任何事情(这就是为什么当从开发人员控制台执行时,整个表达式将计算为1
,从而打印该值(。
在第一种情况下,额外的{}
对只是本地代码块。换句话说,它通常是这样排列的:
try {
{
a:1
}
}
catch(e) {}
要使{a:1}
实际被解释为对象文字,您需要将其包装在括号中:
try {
({a:1})
}
catch(e) {}
老实说,我不太清楚为什么会想要,但在控制台中执行此代码块将打印对象,正如您所期望的那样。
JS解析器在示例中没有看到对象文字,而是看到标签和数字文字。
在第一个示例中,解析器看到:
try {
{
a: 1;
}
} catch (e) {}
因此,在try
块中有一个块,在该块中有标签a
和一个带有数字文字表达式1
的单个表达式语句。
第二个示例是相同的,但没有附加块。
Chrome的控制台在控制台中输出评估结果,在本例中为数字文本1
,这就是为什么您在控制台中看到数字1
。