摘自知乎:https://www.zhihu.com/question/20298345

  1. 田乐:加与不加是风格问题,风格争议不需要有个定论。关键的问题在于如何“争论”,处理好冲突,学会组织语言减少争议是最重要的。因为分号问题在社区内部造成了很多况日持久的口水战,这些口水战是社区的损失……因为大家在这个时候可以写更多的代码带来更多的功能。

类似的问题还有AMD的module,有的库选择兼容AMD,有的人不愿意。公认结论是应该尊重作者的选择,不要因为这些风格问题而fork。module loader应该设法绕过这些问题,提供兼容的解决方案。


  1. 尤雨溪: 没有应该不应该,只有你自己喜欢不喜欢。JavaScript 语法长得 C-like 不代表它本质上和 C 是一类语言,所有直觉性的 “当然应该加分号” 都是保守的、未经深入思考的草率结论。后来新设计的语言里可选分号的多得去了,光是 “可以加分号但是大家都不加” 的语言就有:Go, Scala, Ruby, Python, Swift, Groovy...

至于说 “很难总结什么时候加不加”,其实真的很简单。真正会导致上下行解析出问题的 token 有 5 个:括号,方括号,正则开头的斜杠,加号,减号。我还从没见过实际代码中用正则、加号、减号作为行首的情况,所以总结下来就是一句话:一行开头是括号或者方括号的时候加上分号就可以了,其他时候全部不需要。其实即使是这两种情况,在实际代码中也颇为少见。

另外,restricted production 这个东西(也就是导致 return 后面换行会自动插入分号的机制),不管你加不加分号你都是得搞懂了才能不被坑的,和加不加分号没有什么关系。

更多细节,可以看我曾经给过的一个 talk:Hacking Semicolons by Evan You

最后,上点代码好了,Vue.js 的代码全部不带分号:yyx990803/vue


  1. 贺师俊:当初鉴于本答案过长而可能导致部分“分号党”无法catch到我的主要论点,原本打算重新修订本答案。但是因时间精力因素未予重写,且从本答案的支持来看,为分号正本清源的目的已经达到,所以不再修订本答案。这里仅总结下“分号党”推崇的“总是写分号”风格的最主要缺陷:
  • 人总是有可能忘记写分号。ASI导致无法区分是无意中忘记还是有意不写(代码折行)。
  • 总是写分号”并不能完全解决ASI缺陷(如return后换行会自动插入分号)。
  • “}”后是否要加分号需要回溯到对应“{”之前进行语义判断(是否是函数表达式),成本远高于前置分号判断(只要对行首字符进行token判断:是否是 [ ( + - / 五个符号之一)。

这让我想起一个故事:一位有着长长胡子的老爷爷一直睡眠很好,直到有人问了他一个问题,他就开始失眠了。问题是:睡觉的时候,胡子放到被子外面还是里面?

JavaScript 语句后可以省略分号么?的更多相关文章

  1. JavaScript 语句后应该加分号么?

    分号加与不加完全取决于个人习惯,但为了代码稳定(解析出错)还是建议使用分号断句. JavaScript自动加分号规则:1.当有换行符(包括含有换行符的多行注释),并且下一个token没法跟前面的语法匹 ...

  2. SharePoint 自定义的列表页面中添加javascript的一个 For循环语句后,该页面就打不开了。

    一个sharepoint 2013的普通的列表的自定义新建页面,我在其中新添加几行javascript代码后页面就打不开了.如图所示: 真是一言不合,友谊的页面说打不开就打不开啊.后来慢慢比对发现是因 ...

  3. js中如果省略分号那么它是如何运行的

    在javascript工作中,我们几乎不会去省略分号:为了不必要的麻烦以及代码的规范,那么如果我们省略:会发生呢?预知详情请听下回分解. 看代码! 片段一: 1 var a 2 = 3 8 4 con ...

  4. javascript语句——条件语句、循环语句和跳转语句

    × 目录 [1]条件语句 [2]循环语句 [3]跳转语句 前面的话 默认情况下,javascript解释器依照语句的编写顺序依次执行.而javascript中的很多语句可以改变语句的默认执行顺序.本文 ...

  5. 第五章:Javascript语句

    在javascript中,表达式是短语,那么语句(statement)就是整句或命令.正如英文语句以句号结尾,javascript以分号结尾. 表达式计算出一个值,但语句使某件事发生. “使某件事发生 ...

  6. javascript语句——表达式语句、块语句、空语句和声明语句

    × 目录 [1]表达式 [2]块语句 [3]空语句[4]声明 前面的话 如果表达式在javascript中是短语,那么语句(statement)就是javascript整句或命令.表达式计算出一个值, ...

  7. 【JavaScript】关于 eval()执行JavaScript语句的一次实验测试

    实验主题: eval() 函数可以计算某个字符串,并执行其中的 JavaScript 代码.该函数只接受原始字符串作为参数,如果 string 不是原始字符串,那么该方法将不作任何的改变的返回.因此请 ...

  8. JavaScript 语句

    JavaScript 语句 JavaScript 语句向浏览器发出的命令.语句的作用是告诉浏览器该做什么. JavaScript 语句 JavaScript 语句是发给浏览器的命令. 这些命令的作用是 ...

  9. JavaScript语句

    JavaScript语句 1.JavaScript语句负责向浏览器发出指令,告诉浏览器应该做什么. 2.分号(;): 用于分隔JavaScript语句,通常在每条可执行的语句结尾添加分号,使用分号也可 ...

  10. (四)JavaScript 语句

    JavaScript 语句 JavaScript 语句是发给浏览器的命令. 这些命令的作用是告诉浏览器要做的事情. 下面的 JavaScript 语句向 id="demo" 的 H ...

随机推荐

  1. vue之父组件与子组件的通信

    1.背景 参数传递(多理解) 1.父传子<c-parent :messagevue="message"></c-parent>,请看下面具体的截图描述 2. ...

  2. UE Websocket 通信

    项目中遇到UE需要对接Websocket协议接收实时数据. 所以需要实现一个Websocket Client的功能. 由于UE引擎已经集成了Websocket库(基于libwebsocket),可以通 ...

  3. LVGL line组件

    目录 一.Line(线条)的概念 二.线条组件的使用 1.创建线条对象 2.设置点数组 3.确定y轴的方向(可选) 4.设置线条风格(可选) 4.1创建风格 4.2设置风格 5.将创建好的线段组件添加 ...

  4. R包pheatmap:用参数一步步详细绘制热图

    经常会想到用热图来展示某个基因或某些基因的表达量问题,今天用R中pheatmap包一步步绘制热图. 第一步:公众路径设置,调用包pheatmap,读取目的文件,查看文件. 1 rm(list=ls() ...

  5. Linux下如何在程序中获取某个命令执行的结果?【附源码】

    在工作中遇到一个问题,就是想获取某个函数执行之后打印的字符串信息. 这个功能应用场景挺多的, 特地整理了一下相关知识点分享给大家. 1. 使用临时文件 1) 使用shell的重定向 将命令输出重定向到 ...

  6. 【Linux驱动】充电芯片bq24735调试详解

    一.bq24735简介 bq24735 是一款高效率同步电池充电器. 当系统供电需求暂时高于适配器最大供电水平的时候, bq24735 使用智能加速技术来允许电池向系统中释放能量,这样的话将保护适配器 ...

  7. 获取微信小程序页面路径

    2024/07/12 1.步骤 2.注意事项 3.参考 1.步骤 微信公众号关联小程序时需要用到小程序的页面路径,获取步骤如下:' 登录微信公众平台--工具--生成小程序码--获取更多页面路径--填写 ...

  8. 什么?!90%的ThreadLocal都在滥用或错用!

    最近在看一个系统代码时,发现系统里面在使用到了 ThreadLocal,乍一看,好像很高级的样子.我再仔细一看,这个场景并不会存在线程安全问题,完全只是在一个方法中传参使用的啊!(震惊) 难道是我水平 ...

  9. apr库编译及队列使用笔记

    操作系统 :CentOS 7.9_x64 apr库版本:apr-1.7.4 & apr-util-1.6.3 gcc 版本:4.8.5 队列功能在C++或Python等脚本语言里面,是很容易就 ...

  10. LaTeX 三种短横线的区别

    在 LaTeX 中,有三种基本的短横线,它们各自的长度和用法都有所不同.这三种短横线分别是连字符.短划线(或数字短横)和长划线.下面是它们的具体描述和用法: 连字符 (Hyphen, '-') 用法: ...