本文讨论了 JavaScript 中的分号自动插入机制以及哪些情况下必须要加分号。
原文链接: https://www.liuxing.io/blog/semicolons-in-javascript/
那么究竟是写分号多还是不写分号的多?
1
Leviathann 2021-05-02 18:54:42 +08:00 via iPhone
公司 eslint 都加了必写分号规则,因为几乎没有专职前端,都是招 Java 进来要你写全栈。。
|
2
cmdOptionKana 2021-05-02 19:00:47 +08:00 via Android
不要纠结这个
|
3
liuxing OP @Leviathann 哈哈哈 全干大佬,感谢回复,团队规范才是第一。
|
4
OHyn 2021-05-02 19:06:51 +08:00
顺手加上吧
|
5
musi 2021-05-02 19:11:18 +08:00 via iPhone 1
这不就和你缩进用 tab 还是空格一样的么
规范规定怎么来就怎么来,反正现在的前端基本都要编译。 |
6
falcon05 2021-05-02 19:26:56 +08:00 via iPhone
- 在大多数情况下,换行意味着一个分号。但是“大多数情况”并不意味着“总是”!
- 存在 JavaScript 无法确定是否真的需要自动插入分号的情况。这种情况下发生的错误是很难被找到和解决的。 - 大部分时候可以省略分号,但是最好不要省略分号,尤其对新手来说。 https://zh.javascript.info/structure |
8
suzic 2021-05-02 19:43:03 +08:00 via Android
无论加不加,有统一的规范最重要,不要这个模块加那个模块不加
|
9
evilStart 2021-05-02 19:43:37 +08:00 via Android
不用去纠结这种问题,更不要去浪费时间参与辩论,这都是公说公有理婆说婆有理的东西。
但如果是团队项目的话一定要制定好规范统一, 并且用 linter 强制检查。 不加分号的一些问题也可以用 linter 检查,这些情况可以要求在开头加分号。 |
10
IITII 2021-05-02 20:11:25 +08:00
想写就写(但做好统一,别一行写一行不写。。。
个人偏向于不写 semi 还有这个可以用代码格式话工具自动做(写完格式化一下就好 |
11
Mutoo 2021-05-02 20:11:50 +08:00
自己随手写,看心情加或不加。具体由项目的配置决定,然后交给 prettier 去自动格式化补上或移除分号。
|
12
nexo 2021-05-02 20:17:42 +08:00 via iPhone
但凡你搜一下下就会发现 v 站讨论过 没必要再问一遍
|
13
AmiKara 2021-05-02 20:25:49 +08:00 via iPhone
没记错的话红宝书里好像提到过,加了分号对浏览器解析 JS 更好,但是目前不管你 format 或者 babel 转义后基本都是默认加分号的,所以写的时候不用太纠结
|
14
iOCZ 2021-05-02 21:04:58 +08:00 1
不加怎么压缩,压缩肯定要补上。
|
15
namelosw 2021-05-02 21:08:13 +08:00 1
团队里就看团队的风格
我自己写的时候不加,很啰嗦,debug 上下调整 promise chain 之类的时候编辑起来很碍事。 我方式是全不加,仅当写 IIFE 的时候在行首加一个分号,因为现代情况下除了这种情况之前基本不太可能会导致什么问题。 |
16
EPr2hh6LADQWqRVH 2021-05-02 21:08:14 +08:00 via Android 2
分号不是给编译器加的,是给人加的,降低心智负担。
一个分号就提醒大脑思维告一段落 |
17
bojackhorseman 2021-05-02 21:25:03 +08:00 via iPhone
用了 prettier 统一格式化,不加分号。但我还是喜欢加分号,有点像做数学题先写个解。
|
18
libook 2021-05-02 21:32:35 +08:00 via Android
https://tc39.es/ecma262/
官方标准,看 12.9 章节。 个人倾向于不省略分号,除非有 standardjs 的 linter 保障不出问题,但为了养成好习惯以便于在任何环境都能写出可靠的代码,我也不用 standardjs 。 |
20
shakukansp 2021-05-02 21:36:45 +08:00
用 ts 你就必须加
|
21
JoStar 2021-05-02 21:43:31 +08:00
不加分号会有必须通过前导分号解决一些歧义,现代的 IDE 与 eslint 可以自动提示你。
所以加不加分号已经从一个利弊问题变成了习惯问题了,纯看自己喜欢。 我的启蒙编程语言是 C++,所以我很多东西会按照 C++的思路写,比如在 JS 里写分号。 |
22
liuxing OP @shakukansp ts 中还是和 js 一样 爱写不写
|
23
Track13 2021-05-02 21:58:01 +08:00 via Android
看个人,我不加,但是公司规范里要求加,让格式化工具加就是了。
|
26
xiangyuecn 2021-05-02 22:24:27 +08:00 2
- 必须加分号 (强迫症不接受模棱两可的用法,存在不加就无法运行那就都加)
- tab 缩进 或 4 个以上空格缩进( 2 个空格缩进的代码简直不是给人看的) 以上无争议,也不接受争议🐶 😂 |
27
shakukansp 2021-05-02 22:31:42 +08:00
|
28
liuxing OP @xiangyuecn 哈哈哈 我不加分号也用 2 个 space
|
29
wangcansun 2021-05-02 22:52:31 +08:00
写 java 出身,转到 JavaScript 。习惯性的加分号,毕竟意味着一行代码的结束
|
30
craig 2021-05-02 23:22:25 +08:00
不加分号,锁进用两个空格,使用 ESLint + Prettier 确保代码整洁,不出问题。
|
31
10bkill1p 2021-05-02 23:32:46 +08:00
这就是我直接用 JavaScript Standard Style 的原因,直接统一了节省时间
|
32
HankLu 2021-05-03 00:45:31 +08:00
无所谓
|
33
Rocketer 2021-05-03 01:08:53 +08:00 via iPhone 1
26 楼 @xiangyuecn 和 30 楼 @craig 打一架吧,我看热闹不嫌事大
|
34
momocraft 2021-05-03 02:42:03 +08:00
vue 之父說不加
|
35
Kylin30 2021-05-03 03:27:58 +08:00
我听说加了分号大括号之类的在重新格式化代码工具中不容易出错。
|
36
loading 2021-05-03 07:59:15 +08:00 1
反正我是会加的,不然还要看下一行才知道究竟结束了没。
js 链式写法使然。 |
37
hyrious 2021-05-03 08:15:16 +08:00
想写就写
不写的代价是当行前缀为 [ ( 时需要在前面添加分号 yyx 不写(逃 可以打开 vscode 的 formatOnSave 和 formatOnType,省得思考 ------ 不过我有一个提议,大部分不引起歧义的时候不写,在下一行是 [ ( 开头时编辑器自动在上一行结尾补 ; 不知道能不能写个简单的 formatter 做到这点 |
38
palxie 2021-05-03 08:24:40 +08:00
这个看团队规范, 我们一个内地项目加分号, 一个香港项目不加分号, 都试下还是不加分号的香
|
39
cmdOptionKana 2021-05-03 10:13:32 +08:00 via Android
@hyrious 用 JavaScript Standard Style 就很好
|
40
Kaciras 2021-05-03 10:35:20 +08:00
风格问题,跟 TAB 还是空格缩进,单双引号一样。
GitHub stars 前十的 JS 项目有 8 个都加了。 我建议加,如果做全栈,尽量在不同语言之间保持一致。 |
41
DOLLOR 2021-05-03 10:53:37 +08:00
加分号,因为 JavaScript 不是 PythonScript 。
|
42
xrr2016 2021-05-03 10:57:23 +08:00
反正我是不加
|
43
Stain5 2021-05-03 11:09:53 +08:00
我写 java 都不加,更何况 js
小拇指明明不怎么发达,却承受了这么大的工作量,你们就不能爱惜一下吗 |
44
wulin 2021-05-03 11:29:13 +08:00
写 node,不加
|
45
Lemeng 2021-05-03 12:02:52 +08:00
加或不加,怎么舒服怎么来
|
46
joesonw 2021-05-03 12:17:32 +08:00 via iPhone
引战帖?
|
48
lancelock 2021-05-03 12:38:30 +08:00
不要把精力浪费在这种设计缺陷上,项目统一规范就行,让加就加,不加就不加
|
49
LokiSharp 2021-05-03 12:40:10 +08:00 via iPhone
分号不是开了 eslint reformat 的时候自动就给加上了么
|
50
CokeMine 2021-05-03 13:51:18 +08:00 via Android
Standardjs 规范:不加
airbnb 规范:加 我:加 |
52
ikas 2021-05-03 15:47:47 +08:00
自己项目,爱加不加,多人项目,加,别问为什么
|
53
varzy 2021-05-03 16:03:57 +08:00
Prettier 真是个好东西。。。
|
54
opengps 2021-05-03 16:42:21 +08:00
习惯性加上号,因为有些时候不知不觉两行合并成一行,有分号保证代码不出合并成一条的问题
|
55
henryhu 2021-05-03 16:46:56 +08:00
不加,为了美观
|
56
KomiSans 2021-05-03 16:48:51 +08:00
加上吧,我写 Java 和 C#习惯了,所以...,分号确实是为了能凸显出当前代码声明的结束
|
57
xiebruce 2021-05-03 18:17:32 +08:00
规则上是肯定要加的,不加虽然可以,但那只是浏览器兼容性强,可以用换行来识别语句而已。理论上,加了之后,会减少浏览器的分析时间,当然减少多少时间,这个没有实验过。
|
58
anguiao 2021-05-03 18:23:34 +08:00 via Android
除非你不用 linter,不然这就是个纯粹的个人喜好问题。
首先现在写 JS 基本上都要经过编译,再经过压缩以后,原始代码里有没有分号,对生成的代码并没有影响。 然后如果是必须用分号隔开的情况,也都会提醒你,并不会因为这个出错。 |
59
gdfsjunjun 2021-05-03 22:48:00 +08:00
习惯性加,我反而觉得加分号更美观吧,就像是句子必须加句号。可能受了 C++的影响,2333 。
|
60
huijiewei 2021-05-03 23:23:45 +08:00
我记得 15 年那会用 requirejs 方案的时候都是不加的,后来有了各种打包工具以后又流行加了
所以我现在就是用 Prettier 推荐的方案 加 |
61
ericgui 2021-05-04 05:31:44 +08:00
这个是个人主观选择的代码风格
我司没有 我个人项目有 |
62
image72 2021-05-04 08:09:04 +08:00
最佳实践肯定是 nodejs 源代码,加分号,2 space 锁进。 谁敢说自己代码写的比 nodejs 源代码更好
|
63
image72 2021-05-04 08:13:25 +08:00 1
包括几乎所有的 w3c,ECMA 提案中的实例代码,都是加分号,2 spacce 锁进
|
64
zgl263885 2021-05-04 14:36:38 +08:00 via iPhone
可能我比较菜,我的原则是,只要这些代码还有可能给人看,全加上。不光分号,if 语句后面的花括号我也是全加上。
给我看的代码,如果省略了很多,导致我阅读障碍,我心里(甚至发出声)会骂人的,这写的什么玩意儿! |
65
jqtmviyu 2021-05-04 21:32:54 +08:00
保护小拇指, 但单条语句会加大括号.
|
67
aleen42 2021-05-05 07:17:06 +08:00 via Android
如果沒有強迫加,就很容易因 JS 分文件加載而導致前一個文件的最後一句與後一個文件的首句間缺少分號阻隔。這種情況下很多人習慣在每個文件頭都加一個分號以保證容錯
|
68
msg7086 2021-05-05 13:37:45 +08:00
我写 VueJS,不加。
我觉得更重要的问题不是加与不加,而是知道什么时候语言会给你加,什么时候会不给你加。 毕竟 JS 里是有就算你不加分号也会给你强制加上的情况,所以如果你不懂,那等你写的时候就会有坑了。 比如 return 后的换行是会强行给你加分号的。 如果你不懂分号机制,就算是全程加分号,也无法避免下面的代码撞坑。 return { data: 1 }; |
69
liuxing OP @msg7086 哈哈哈 对 原文有讨论 ASI 机制 https://www.liuxing.io/blog/semicolons-in-javascript/
|
71
yl14786922106 2021-05-06 09:06:21 +08:00
let a = 1
(function (){console.log(a)})() VM45:2 Uncaught TypeError: 1 is not a function at <anonymous>:2:1 (anonymous) @ VM45:2 let a = 1; (function (){console.log(a)})() VM53:2 1 undefined 执行下就知道 该不该加了。 |
72
zzzmh 2021-05-06 09:57:01 +08:00
问了前端说不加
但我 java 出身写 vue 必须都加,不加浑身难受 |
73
zhuweiyou 2021-05-06 14:15:51 +08:00
这是引战话题.
我习惯不加, 然后配合 prettier 规则格式化. 其实重点不是加不加, 是团队需要统一风格比较好. |
74
zone10 2021-05-06 14:26:18 +08:00
能不加分号的语言加分号像个憨猪, 点名 JS, Go, Scala, 当然, 老大是从 Java 过来的憨猪硬让你加也没办法
|
75
BoringTu 2021-05-06 14:29:57 +08:00
来来来,咱们聊聊两点:
1. 缩进。A 需要视觉上缩进是 4 个字符距离,B 需要视觉上缩进是 2 个字符距离,C 需要视觉上缩进是 3 个字符距离。你们用空格来缩进的怎么处理?忽略个人需求,强制使用? 2. 格式化代码。你们疯了吧?习惯性格式化代码是个什么习惯,不怕被打死?每个人的编辑器都不一样,A 把代码提交了,B 拉下来改东西然后格式化了一下代码也 push 了,这时候 B 的这个 commit 文件对比的意义何在?很可能全篇都是改动,怎么对比? |
76
nekochyan 2021-05-06 14:57:31 +08:00
看个人习惯,建议加分号和 4 空格缩进;
如果是团队就跟着团队走,我们公司都是加分号和 4 空格缩进的,所以我写代码的时候随时习惯格式化一下提交也没啥冲突 |
77
hamptonchen 2021-05-16 09:53:42 +08:00
现在绝大多数前端项目都是在 Vue 、React 、Angular 等框架下开发的,这些其实可以不用加分号,因为代码最后打包的时候会被编译,编译器会自动帮你加上的
|
78
wangtian2020 2021-05-17 16:32:29 +08:00
我的 vscode 用户 setting.json 中的 prettier 配置
"prettier.useTabs": false, "prettier.tabWidth": 4, "prettier.singleQuote": true, "prettier.trailingComma": "es5", "prettier.printWidth": 140, "prettier.semi": false, 不加分号 |