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

2024-04-30

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

如果有人有,比如izs http://izs.me/或者 Bootstrap 开发者,选择在什么条件下编写不带分号的 Javascriptmust他们添加了一个分号,那么他们还应该做什么来确保他们的代码不会失败?


避免意外合并两行

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

例如,以下代码:

  // 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)

所以一般来说,建议遵循的规则是:

当一行开头为一个括号( or [

或使用算术运算符+ - * /或正则表达式/.../

然后加一个分号;在它的前面。

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

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

Sources:

  • JavaScript 中的分号是可选的 http://mislav.uniqpath.com/2010/05/semicolons/我发现了here https://stackoverflow.com/questions/444080/do-you-recommend-using-semicolons-after-every-statement-in-javascript?lq=1#6651902
  • 伊尼米诺的文章JavaScript 分号插入 http://inimino.org/%7Einimino/blog/javascript_semicolons

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

出于类似的原因,也建议使用分号在库脚本的开头和结尾将被释放到野外。事实上,无论您在脚本中使用什么样式,都建议这样做。

在此示例中,带有IIFE http://benalman.com/news/2010/11/immediately-invoked-function-expression/:

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

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

作为替代方案,Bootstrap 领先+,不将 IIFE 包装在(...),并以;。其他变化导致!代替+ or ;.

正常使用分号的地方

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

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

当你不这样的时候将多个语句放在一行上:

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

使用短绒检查器

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

例如,所谓的标准js https://standardjs.com/linter 将检测上面提出的问题。 (他们还发布了eslint 配置 https://www.npmjs.com/package/eslint-config-standard如果您更喜欢使用 eslint,但我不确定这些规则有多全面。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我必须遵循哪些规则才能编写没有分号的有效 Javascript? 的相关文章

随机推荐

  • Cordova 错误:您的 ios 平台没有 Api.js

    我正在尝试构建一个 cordova ios 应用程序 但运气不佳并且出现奇怪的错误 将此版本的 Cordova 与旧版本的 cordova ios 一起使用是 已弃用 升级到 电子邮件受保护 cdn cgi l email protecti
  • Puppet - 在迭代哈希时,如果 hiera 中不存在,则在清单中设置默认值

    我正在迭代 hiera 哈希中的许多条目 并希望通过在清单中设置默认值 例如ensure groups managehome等 并且如果 hiera 中存在重复的键 值对 则覆盖默认值 到目前为止 我尝试过的所有方法都无法获得默认值 我知道
  • c:forEach 在单个表行中显示所有内容

    目前我正在做一个项目 我需要在数据库的列中显示信息 但由于某种原因它们显示在一行中 现在显示如下 我还附上了我的 jsp 页面中的代码 table border 1 cellspacing 0 cellpadding 3 style fon
  • 主线程检查器:在后台线程上调用 UI API iOS 11 Xcode 9 GM Seed

    任何人都可以帮助我调试这个问题 从我开始使用 Xcode 9 GM 种子和 iOS 11 GM 种子开始 我的代码在控制台中向我发出警告 2017 09 18 16 22 52 872716 0530 359 20158 reports M
  • Jenkins + Cmake + JIRA = 多个相互依赖项目的 CI?

    我们的系统中有许多小项目在 Linux 上运行 Slackware 7 11 正在慢慢迁移到 RHEL 6 0 大约 50 100 个应用程序和 15 20 个库 我们几乎所有的应用程序都使用我们的一个或多个库 我们的源树看起来像这样 ap
  • Vuex - “不要在突变处理程序之外改变 vuex 存储状态”

    我正在尝试从 Firestore 初始化我的 Vuex 商店 最后一行代码context commit SET ACTIVITIES acts 是什么造成了错误 我不认为我会直接改变状态 因为我正在使用一个动作 我可能会错过什么 这是我的
  • Sonatype Nexus 3 - 记录 URL 代理请求

    我正在尝试调试代理存储库的问题 为我知道被代理的存储库中存在的工件提供 404 在我的情况下这是一个 NPM 包 我想启用日志记录 以便可以看到 Nexus 在响应该代理请求时尝试访问的 URL 但似乎找不到任何提供此输出的默认记录器 我需
  • 在 JavaScript 中检查数组是否包含 null 以外的内容?

    我有一个数组 很可能总是这样 null null null null null 有时这个数组可能会变成这样 helloworld null null null null 我知道我可以使用 for 循环 但是有没有办法使用indexOf检查数
  • AddExtension 属性在 C# 2.0 中如何工作?

    我想打开一个保存文件对话框 让用户输入文件名 如果他们忘记了 csv 扩展名 请添加它 SaveFileDialog AddExtension 属性似乎可以工作 但事实并非如此 我什至将 DefaultExt 属性设置为 csv 但仍然没有
  • 使用正则表达式验证姓名

    我正在尝试编写一个正则表达式name and surname 它们由一个或多个只能由字母组成的单词组成 我不关心首字母大写字母 I 想匹配名字和姓氏 Names Antony de Home April antony de Home Apr
  • 为每一表行创建一个 json

    我想从表中的数据创建 json 表格看起来像这样 code D5ABX0 MKT536 WAEX44 我正在使用 FOR JSON PATH 这很好 SELECT code FROM feature FOR JSON PATH 但是这个查询
  • 安全灵活的跨域会话

    我有一个问题希望你能帮忙解决 假设我在一家名为 Blammo 的假设公司工作 我们有一个名为 Log 的假设产品 我正在尝试建立一个系统 人们可以登录 logfromblammo com 并订购我们的一些产品 然后当他们准备好购买时 前往
  • NSCollectionView 单元格顺序随视图更改而更改

    我有一个包含选项卡栏设计的 macOS 应用程序 即 Tweetbot 有 4 个选项卡链接到 4 个不同的视图控制器 初始视图控制器 视图一 包含一个NSCollectionView水平显示 3 个单元格 这一切都工作正常 但是当我切换到
  • SwiftUI - 将数据传递到不同的视图

    我正在开发一个有 4 个不同视图的应用程序 主视图 内容视图 an AddView an EditView 以及一个分离的DataView在一个类中 我通过一个传递所有数据可观察对象到其他意见 在主视图中我有一个项目列表 在里面AddVie
  • 针对 REST API 的授权会引发错误:401(未找到请求的凭据。)

    我想针对 HP Alm Rest API 进行授权 我认为这 应该 有效 但事实并非如此 function performSignIn let headers new Headers headers append Content Type
  • 将 css 宽度字符串转换为常规数字

    在尝试计算隐藏元素的宽度时 我发现 jquery width 对于该元素的宽度返回 0 我发现使用 jquery css width 将通过使用声明的样式宽度返回正确的宽度 即使该值与初始样式表不同 问题是 css width 方法返回一个
  • HikariPool-1 - 无法验证连接 org.postgresql.jdbc.PgConnection@2a84e649(此连接已关闭。)

    我正在使用 Postgresql 和 spring boot 2 0 4 当尝试依次执行查询时 会引发以下错误 我执行了以下查询 并且计数不断增加 SELECT COUNT FROM pg stat activity WHERE state
  • Aruco 标记与 openCv,获取 3d 角坐标?

    我正在使用 opencv 3 2 检测打印的 Aruco 标记 aruco estimatePoseSingleMarkers corners markerLength camMatrix distCoeffs rvecs tvecs 这将
  • Windows XP 中“附带”了什么 .NET 框架

    你能告诉我Windows XP系统上默认安装的 NET框架是什么吗 因为我想编写一个不需要安装任何其他东西的 C 应用程序 如果没有 有什么办法不强迫用户下载 net框架 例如3 5 而是安装它 Windows XP 没有附带任何版本的 N
  • 我必须遵循哪些规则才能编写没有分号的有效 Javascript?

    有很多关于 我应该使用分号吗 的问题 和 分号注入是如何工作的 但我想为那些决定尽可能避免使用分号的程序员找到无 FUD 的建议 如果有人有 比如izs http izs me 或者 Bootstrap 开发者 选择在什么条件下编写不带分号