JavaScript和分号

Pet*_*Guo 4 strict typeerror node.js

'use strict'
[1,2,3,4].find(x => x > 1)
Run Code Online (Sandbox Code Playgroud)

使用nodejs 5.0.0执行上述代码时,会出现以下错误:

TypeError: "use strict"[(((1 , 2) , 3) , 4)].find is not a function
at Object.<anonymous> (C:\src\nodejs\ecma6.js:2:11)
at Module._compile (module.js:425:26)
at Object.Module._extensions..js (module.js:432:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Function.Module.runMain (module.js:457:10)
at startup (node.js:136:18)
at node.js:972:3
Run Code Online (Sandbox Code Playgroud)

如果我在'use strict'之后添加分号,则错误消失.

这看起来像一个错误......或者是否有更深层次的含义 - 意味着语言规范中是否存在一个特殊情况列表,其中需要使用分号.

更新

语言规范列出了特殊情况,其中需要显式分号.

sle*_*man 7

这就是为什么总是建议在javascript中使用分号的原因之一.它不起作用的原因是因为代码被解释为:

"use strict"[1,2,3,4] ...
Run Code Online (Sandbox Code Playgroud)

换句话说,它被解释为:

"use strict"[4] ...
Run Code Online (Sandbox Code Playgroud)

因为逗号运算符.这将计算为字符串"s".

现在,其余代码正在尝试:

"s".find()
Run Code Online (Sandbox Code Playgroud)

但是字符串没有find方法.

为了避免这一切,请确保告诉解释器这两行是单独的语句 - 使用分号.


附加说明:

ECMAScript标准(至少ES5)需要此行为.在第7.9.1节第1部分中,定义了管理此案例的规则:

当从左到右解析程序时,遇到任何语法生成不允许的令牌(称为违规令牌),如果出现以下一个或多个,则在违规令牌之前自动插入分号条件是真的:

  1. 通过至少一个LineTerminator将违规令牌与先前令牌分开.

  2. 违规令牌是}.

在这种情况下,"use strict"[1,2,3,4]...解析.编译器查看结果语句:

"use strict"[1,2,3,4]...
Run Code Online (Sandbox Code Playgroud)

并注意到这是有效的JavaScript.因此,未插入分号,因为在语句中未找到"违规令牌".