我正在学习 JavaScript,不知何故我发现我可以跳过;在一行的末尾打字,只要该行中只有一个语句。其实我有点习惯了;我用 Swift 开发了一个简单的 iOS 应用程序,它也支持这种语法。
但我想知道是否有特定版本或 JavaScript 不允许程序员省略最后一个分号。许多语言的语法都发生了变化;所以我猜 JavaScript 可能有这种问题。
请注意,虽然所有版本的 JavaScript 都支持 ASI,但 ASI 存在缺陷,这意味着您无法摆脱所有分号。
例如,以下内容不会像您预期的那样工作:
function foo() { return [2, 3] }
var x, y, i, j
j = 2
i = j
[x,y] = foo()
Run Code Online (Sandbox Code Playgroud)
你可能会想到的是i,j和x将等于2,和y将等于3,这是如果每线都分号终止会发生什么。然而,事实并非如此。
事实上,iis [2,3]、 whilex和yare undefined。当 ASI 在该部分代码上运行时,它将最后两行解释为属性访问:
i = j[x,y] = foo()
Run Code Online (Sandbox Code Playgroud)
虽然它可能是一个解构操作:
i = j;
[x,y] = foo();
Run Code Online (Sandbox Code Playgroud)
解决这个问题的一种方法是在任何以 [] 或 () 开头的行之前使用“防御性分号”,这些行不打算被视为前一个语句的延续。