我一直在摆弄 JavaScript,但发现了一些我不理解的行为。问题似乎与自动分号插入(ASI)有关,但对我来说,ASI 似乎行为不端。以下代码已使用node v8.10
和 Google Chrome 的开发人员工具控制台(版本 73.0.3683.86(官方构建)(64 位))进行了测试。
> 0 == {}
false
> {} == 0
...
这三个点的意思是Uncaught SyntaxError: Unexpected token ==
(取自 chrome 的开发人员工具的控制台输出。)它似乎被 ASI 解释为实际上将它变成了{;} == 0
,但从阅读规范(上面链接)来看,它不应该那样做。我误解了规格吗?
这会导致一些有趣的情况,也有一些奇怪的情况。例如,{} + 4
计算结果为 4,因为它是{;} + 4
,或者只是+4
。但是,4 + {}
是'4[object Object]'
。而且,奇怪的是:
> {} + 4 + {}
'[object Object]4[object Object]'
它没有变成{;} + 4 + {}
,这与 相同4 + {}
,现在它实际上接受了第一个{}
作为对象而不是块!最右边的标记很重要:
> {} + 4 + {} + 4
'4[object Object]4'
现在,第{}
一个再次被解释为一个空块。此外,
> {} + {}
'[object Object][object Object]'
> {} + {} + 4
NaN
第二行的行为似乎又是 ASI,因为+{}
, orNumber({})
的计算结果为NaN
(第一行{}
再次被解释为空块。)
额外有趣的代码:
> {a:3}.a + 2
... // Uncaught SyntaxError: Unexpected token .
> ({a:3}.a + 2)
5
这一次,第一个实际上变成了一个带有标签的空块a
!
我预计在这些示例中不会发生 ASI,因为它应该已经(我认为)是语法的有效产生。我们如何不断交替最右边的标记 ({} + 4 + {}
和{} + 4 + {} + 4
) 似乎很奇怪,它改变了第一个的含义{}
。