在js里面什么时候需要用 ; 来作结束标志
- 有人坚持认为 js 不应该用分号作为结束标志,换行即可,多写一个分号会觉得多余
- 也有人坚持一定要习惯用
;来表示结束,即便多写一两个分号其实也没什么错 - 其实怎么使用是个人风格问题,但我们要了解什么情况下,不用
;会存在风险- 其实也很简单,在换行之后碰到以下的5种操作符号作为语句的开始时就会存在风险
- 而且有些风险是显性的,而有些则是隐性的:
+ - [ ( / - 也就是这几个符号组合起来的表达式,存在跨行运算进而导致程序异常
- 我简单总结了一下,它们都有两个共同点:
- 这些符号在 js 中都存在二义性或多义性;
- 优先级不同,优先级高的表义会覆盖优先级低的。
先看圆括号 (
在js里面圆括号是优先级最高的运算符,因此在它之前存在另外一个表达式,就要用分号隔开,否则就会出现异常,而且它的异常存在隐式的错误,也就是不报错,但运行结果不是预期的,导致问题很难定位。
圆括号的二义性
- 表示一个独立表达式(例如:
1 + 2 * 3 = 7 , (1 + 2) * 3 = 9),优先级 20 - 表示函数运行表达式(例如:a() ),优先级 10
- 注意:js 运算符的优先级有20级,20~0递减,数值越大,越优先
- 参考:
运算符优先级
加号 + 和减号 -
- 表现和
(类似,不过+-还存在隐式的类型转换 - 很多 bug 都是这玩意导致的,而且也比较难定位。
二义性
- 一元 加法/减法 ,优先级16
- 加法/减法 运算 ,优先级14
方括号 [
[]是成员访问表达式(Property accessors)- 在所有运算操作符中,优先级仅仅次于圆括号
(),而高于+- - 另外成员访问表达式还有点符号(
.) - 两者的优先级是一致的。在什么情况下会出现异常呢?
方括号的三义性
- 数组/对象的成员访问符 ,优先级19
- 数组字面量,快速定义数组,优先级 无
- ES2015以后,数组解构表达式,用于批量赋值
除号 /
这个 (
/) 符号有一点点特殊,不过也是会出现类似以上几种操作的异常表现的符号之一。其实它除了表示除号外,同时还是正则表达式字面量的开始,一般会碰到正则时会出现异常。
除号的二义性
- 除法运算,优先级14
- 正则表达式字面量的开始,优先级 无
补充:{} 花括符
当使用 function,if,switch,while 等书写的语句时,跟着以上几种表达并不会出现异常表现,而用来定义对象时却会,其实是因为
{}存在多种意义,在 ES5 里面是二义性,而到了ES2015则有多意性:
- 代码块,function,if,switch,while等跟着的就是这种;
- 对象字面量,用来快速定义一个对象;
- 在ES2015,
{}还作为表示一个块级作用域,用法可以参考块级作用域 - ES2015以后,对象解构表达式
- ES2015,长文本内变量标志符
对于分号的处理,我的观点
我觉得还是坚持合理书写分号吧,反正最后发布都是要压缩优化的,多写一两个分号也不是什么大事。
当然,大牛们觉得不需要写分号,那是人家明白什么情况下会出现异常,如果你觉得自己都明白了,那也可以尝试无分号的代码风格,这可能比较吊吧~~
不过,在绝大多数项目中,我们书写的代码其实是为了给别人看的,“别人”就有可能不知道什么时候该加分号。所以团队合作的项目,我个人认为,书写分号是必须的,无分号的代码风格更适合个人项目,或个个都是大牛的项目。
如何避免由于遗漏分号而导致一些难以定位的问题,其实可以借助代码检测工具来避免,比如:ES5 推荐 jshint,ES2015则推荐 eslint。
- 作者:igetit
- 链接:原文地址
- 来源:知乎
- 著作权归作者所有,转载请联系作者获得授权。