javascript - 我必须遵循哪些规则才能编写不带分号的有效 Javascript?

标签 javascript syntax

有很多关于“我应该使用分号吗?”的问题和“分号注入(inject)是如何工作的?”,但我想为决定要尽可能避免使用分号的编码人员找到无 FUD 的建议。

如果有人有,比如izs或者选择编写不带分号的 Javascript 的 Bootstrap 开发人员,在什么情况下他们必须添加分号,他们还应该做些什么来确保他们的代码不会失败?

最佳答案

避免意外合并两行

假设您打算使用换行符代替分号,一个经常被忽视的错误是将两行组合成一个表达式的代码。

例如下面的代码:

  // DANGEROUS
  a = b + c
  (d + e).print()

将被解释为:

  a = b + c(d + e).print()

解决方法是:

  // SAFE
  a = b + c
  ;(d + e).print()

类似的问题出现在:

  // DANGEROUS
  console.log()
  ['three', 'two', 'one'].forEach(console.log)

所以一般来说,推荐遵循的规则是:

When a line starts with a parenthesis ( or [

or with an arithmetic operator + - * / or regexp /.../

then put a semicolon ; in front of it.

(但是请注意,++ --// 没有分号也是安全的。)

(您实际上永远不会单独编写 */,因此以这种方式开始一行是没有意义的,但有时您可能想要开始一个行与 /.../ 正则表达式。在这种情况下,如果不使用分号,这很可能会导致语法分析错误。 ( [ + - 情况更危险,因为它们会导致运行时错误。)

来源:

避免在开始和结束时合并级联文件

出于类似的原因,分号也是可取的在库脚本的开头和结尾,这将被发布到野外。事实上,无论您在脚本中使用何种样式,都建议这样做。

在这个例子中有一个 IIFE :

  // my-library.js
  ;(function(){
      ...
  })();
  • 前导分号将确保您的外括号 (...) 不会尝试在您之前连接的脚本尾部调用未终止的表达式.

  • 尾随分号是一种很好的做法,以防在您的脚本之后串联的脚本以 IIFE 开头而忽略了以其自己的分号开头。

作为替代方案,Bootstrap 以 + 开头,不将 IIFE 包装在 (...) 中,并以 ; 结尾>。其他变体以 ! 开头,而不是 +;

分号正常的地方

唯一需要分号的时间是在传统的 for 循环中:

  for (var i = 0; i < 10; i++) { // good luck doing that without semicolons!

并且当您以其他方式在一行中放置多个语句时:

  x = obj[k]; delete obj[k]; return asChar(x)

使用 linter

某些 linter 会检测您的代码何时可能产生意想不到的后果,并鼓励您遵循上述做法。

比如所谓的standardjs linter 将检测上面提出的问题。 (他们也发布了 eslint config 如果您更喜欢使用 eslint,但我不确定这些规则有多全面。)

关于javascript - 我必须遵循哪些规则才能编写不带分号的有效 Javascript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25088708/

相关文章:

python - 为什么语法错误,代码无法按顺序打印

php - mysql 查询只返回在特定时间后添加的行

javascript - 如何在不使用 HTML5 中的输入文件的情况下上传在 java 中创建的文件

php - 在 php 和 javascript 之间传递 utf-8 字符串

Javascript 超时循环将多行保存到 Parse.com

syntax - 类型差异小

python - 无法实例化子目录中定义的类

javascript - D3 集群部队布局中的淡入淡出/突出显示

javascript - 尝试获取复选框标签,但获取对象

c++ - 没有标识符时如何读取复杂的 C++ 类型声明?