JavaScript和分号

'use strict' [1,2,3,4].find(x => x > 1) 

当使用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 

如果在“严格使用”之后添加分号,则错误消失。

这看起来像一个bug …还是有什么更深层次的 – 意味着在语言规范中是否有一个例外情况的列表,其中需要分号。

更新

语言规范确实列出了需要明确分号的例外情况。

这是为什么总是build议在javascript中使用分号的一个原因。 它不工作的原因是因为代码被解释为:

 "use strict"[1,2,3,4] ... 

换句话说,它被解释为:

 "use strict"[4] ... 

由于逗号运算符 。 这是评估string"s"

现在,其余的代码正在试图做到:

 "s".find() 

但是string没有find方法。

要避免这一切,请确保告诉解释器这两行是单独的语句 – 使用分号。


附加说明:

这种行为是ECMAScript标准(至less是ES5)所要求的。 在第7.9.1部分第1节中规定了关于这种情况的规则:

当从左向右parsing程序时,会遇到任何语法产生都不允许的令牌(称为违规令牌),那么在冒犯令牌之前会自动插入一个分号,如果一个或多个以下条件是正确的:

  1. 有问题的令牌至less由一个LineTerminator与前一个令牌分开。

  2. 有罪的令牌是}。

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

 "use strict"[1,2,3,4]... 

并注意到这是有效的JavaScript。 因此,不会插入分号,因为在语句中找不到“冒犯标记”。