V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liuxing
V2EX  ›  Node.js

JavaScript 中到底加不加分号?

  •  2
     
  •   liuxing · 2021-05-02 18:47:32 +08:00 · 8939 次点击
    这是一个创建于 1330 天前的主题,其中的信息可能已经有所发展或是发生改变。

    JavaScript 中的分号问题

    本文讨论了 JavaScript 中的分号自动插入机制以及哪些情况下必须要加分号。

    原文链接: https://www.liuxing.io/blog/semicolons-in-javascript/

    那么究竟是写分号多还是不写分号的多?

    78 条回复    2021-05-17 16:32:29 +08:00
    Leviathann
        1
    Leviathann  
       2021-05-02 18:54:42 +08:00 via iPhone
    公司 eslint 都加了必写分号规则,因为几乎没有专职前端,都是招 Java 进来要你写全栈。。
    cmdOptionKana
        2
    cmdOptionKana  
       2021-05-02 19:00:47 +08:00 via Android
    不要纠结这个
    liuxing
        3
    liuxing  
    OP
       2021-05-02 19:02:10 +08:00
    @Leviathann 哈哈哈 全干大佬,感谢回复,团队规范才是第一。
    OHyn
        4
    OHyn  
       2021-05-02 19:06:51 +08:00
    顺手加上吧
    musi
        5
    musi  
       2021-05-02 19:11:18 +08:00 via iPhone   ❤️ 1
    这不就和你缩进用 tab 还是空格一样的么
    规范规定怎么来就怎么来,反正现在的前端基本都要编译。
    falcon05
        6
    falcon05  
       2021-05-02 19:26:56 +08:00 via iPhone
    - 在大多数情况下,换行意味着一个分号。但是“大多数情况”并不意味着“总是”!

    - 存在 JavaScript 无法确定是否真的需要自动插入分号的情况。这种情况下发生的错误是很难被找到和解决的。

    - 大部分时候可以省略分号,但是最好不要省略分号,尤其对新手来说。

    https://zh.javascript.info/structure
    weijar
        7
    weijar  
       2021-05-02 19:41:28 +08:00
    @falcon05 这个说法早就 out 了,现在写 JS 都必用 linter,没有你说的问题。反正加分号影响视觉。
    suzic
        8
    suzic  
       2021-05-02 19:43:03 +08:00 via Android
    无论加不加,有统一的规范最重要,不要这个模块加那个模块不加
    evilStart
        9
    evilStart  
       2021-05-02 19:43:37 +08:00 via Android
    不用去纠结这种问题,更不要去浪费时间参与辩论,这都是公说公有理婆说婆有理的东西。
    但如果是团队项目的话一定要制定好规范统一, 并且用 linter 强制检查。
    不加分号的一些问题也可以用 linter 检查,这些情况可以要求在开头加分号。
    IITII
        10
    IITII  
       2021-05-02 20:11:25 +08:00
    想写就写(但做好统一,别一行写一行不写。。。
    个人偏向于不写 semi
    还有这个可以用代码格式话工具自动做(写完格式化一下就好
    Mutoo
        11
    Mutoo  
       2021-05-02 20:11:50 +08:00
    自己随手写,看心情加或不加。具体由项目的配置决定,然后交给 prettier 去自动格式化补上或移除分号。
    nexo
        12
    nexo  
       2021-05-02 20:17:42 +08:00 via iPhone
    但凡你搜一下下就会发现 v 站讨论过 没必要再问一遍
    AmiKara
        13
    AmiKara  
       2021-05-02 20:25:49 +08:00 via iPhone
    没记错的话红宝书里好像提到过,加了分号对浏览器解析 JS 更好,但是目前不管你 format 或者 babel 转义后基本都是默认加分号的,所以写的时候不用太纠结
    iOCZ
        14
    iOCZ  
       2021-05-02 21:04:58 +08:00   ❤️ 1
    不加怎么压缩,压缩肯定要补上。
    namelosw
        15
    namelosw  
       2021-05-02 21:08:13 +08:00   ❤️ 1
    团队里就看团队的风格

    我自己写的时候不加,很啰嗦,debug 上下调整 promise chain 之类的时候编辑起来很碍事。

    我方式是全不加,仅当写 IIFE 的时候在行首加一个分号,因为现代情况下除了这种情况之前基本不太可能会导致什么问题。
    EPr2hh6LADQWqRVH
        16
    EPr2hh6LADQWqRVH  
       2021-05-02 21:08:14 +08:00 via Android   ❤️ 2
    分号不是给编译器加的,是给人加的,降低心智负担。
    一个分号就提醒大脑思维告一段落
    bojackhorseman
        17
    bojackhorseman  
       2021-05-02 21:25:03 +08:00 via iPhone
    用了 prettier 统一格式化,不加分号。但我还是喜欢加分号,有点像做数学题先写个解。
    libook
        18
    libook  
       2021-05-02 21:32:35 +08:00 via Android
    https://tc39.es/ecma262/

    官方标准,看 12.9 章节。

    个人倾向于不省略分号,除非有 standardjs 的 linter 保障不出问题,但为了养成好习惯以便于在任何环境都能写出可靠的代码,我也不用 standardjs 。
    liuxing
        19
    liuxing  
    OP
       2021-05-02 21:33:20 +08:00
    @suzic hhh 对
    shakukansp
        20
    shakukansp  
       2021-05-02 21:36:45 +08:00
    用 ts 你就必须加
    JoStar
        21
    JoStar  
       2021-05-02 21:43:31 +08:00
    不加分号会有必须通过前导分号解决一些歧义,现代的 IDE 与 eslint 可以自动提示你。

    所以加不加分号已经从一个利弊问题变成了习惯问题了,纯看自己喜欢。

    我的启蒙编程语言是 C++,所以我很多东西会按照 C++的思路写,比如在 JS 里写分号。
    liuxing
        22
    liuxing  
    OP
       2021-05-02 21:47:30 +08:00
    @shakukansp ts 中还是和 js 一样 爱写不写
    Track13
        23
    Track13  
       2021-05-02 21:58:01 +08:00 via Android
    看个人,我不加,但是公司规范里要求加,让格式化工具加就是了。
    liuxing
        24
    liuxing  
    OP
       2021-05-02 21:58:26 +08:00
    @avastms 哈哈哈 原来还有这功能
    falcon05
        25
    falcon05  
       2021-05-02 22:15:35 +08:00 via iPhone   ❤️ 1
    @weijar 别逗,谁说写 js 必须用 linter ???
    xiangyuecn
        26
    xiangyuecn  
       2021-05-02 22:24:27 +08:00   ❤️ 2
    - 必须加分号 (强迫症不接受模棱两可的用法,存在不加就无法运行那就都加)

    - tab 缩进 或 4 个以上空格缩进( 2 个空格缩进的代码简直不是给人看的)

    以上无争议,也不接受争议🐶 😂
    shakukansp
        27
    shakukansp  
       2021-05-02 22:31:42 +08:00
    @liuxing
    有的地方加有的地方不加你也能忍么
    如果上面一行是个函数调用,下面一行开头是个断言就一定要加分号
    如果其他地方都不加分好那就变成了有的地方加有的地方不加,不统一
    所以必须加
    liuxing
        28
    liuxing  
    OP
       2021-05-02 22:41:07 +08:00
    @xiangyuecn 哈哈哈 我不加分号也用 2 个 space
    wangcansun
        29
    wangcansun  
       2021-05-02 22:52:31 +08:00
    写 java 出身,转到 JavaScript 。习惯性的加分号,毕竟意味着一行代码的结束
    craig
        30
    craig  
       2021-05-02 23:22:25 +08:00
    不加分号,锁进用两个空格,使用 ESLint + Prettier 确保代码整洁,不出问题。
    10bkill1p
        31
    10bkill1p  
       2021-05-02 23:32:46 +08:00
    这就是我直接用 JavaScript Standard Style 的原因,直接统一了节省时间
    HankLu
        32
    HankLu  
       2021-05-03 00:45:31 +08:00
    无所谓
    Rocketer
        33
    Rocketer  
       2021-05-03 01:08:53 +08:00 via iPhone   ❤️ 1
    26 楼 @xiangyuecn 和 30 楼 @craig 打一架吧,我看热闹不嫌事大
    momocraft
        34
    momocraft  
       2021-05-03 02:42:03 +08:00
    vue 之父說不加
    Kylin30
        35
    Kylin30  
       2021-05-03 03:27:58 +08:00
    我听说加了分号大括号之类的在重新格式化代码工具中不容易出错。
    loading
        36
    loading  
       2021-05-03 07:59:15 +08:00   ❤️ 1
    反正我是会加的,不然还要看下一行才知道究竟结束了没。
    js 链式写法使然。
    hyrious
        37
    hyrious  
       2021-05-03 08:15:16 +08:00
    想写就写
    不写的代价是当行前缀为 [ ( 时需要在前面添加分号
    yyx 不写(逃
    可以打开 vscode 的 formatOnSave 和 formatOnType,省得思考
    ------
    不过我有一个提议,大部分不引起歧义的时候不写,在下一行是 [ ( 开头时编辑器自动在上一行结尾补 ;
    不知道能不能写个简单的 formatter 做到这点
    palxie
        38
    palxie  
       2021-05-03 08:24:40 +08:00
    这个看团队规范, 我们一个内地项目加分号, 一个香港项目不加分号, 都试下还是不加分号的香
    cmdOptionKana
        39
    cmdOptionKana  
       2021-05-03 10:13:32 +08:00 via Android
    @hyrious 用 JavaScript Standard Style 就很好
    Kaciras
        40
    Kaciras  
       2021-05-03 10:35:20 +08:00
    风格问题,跟 TAB 还是空格缩进,单双引号一样。
    GitHub stars 前十的 JS 项目有 8 个都加了。
    我建议加,如果做全栈,尽量在不同语言之间保持一致。
    DOLLOR
        41
    DOLLOR  
       2021-05-03 10:53:37 +08:00
    加分号,因为 JavaScript 不是 PythonScript 。
    xrr2016
        42
    xrr2016  
       2021-05-03 10:57:23 +08:00
    反正我是不加
    Stain5
        43
    Stain5  
       2021-05-03 11:09:53 +08:00
    我写 java 都不加,更何况 js

    小拇指明明不怎么发达,却承受了这么大的工作量,你们就不能爱惜一下吗
    wulin
        44
    wulin  
       2021-05-03 11:29:13 +08:00
    写 node,不加
    Lemeng
        45
    Lemeng  
       2021-05-03 12:02:52 +08:00
    加或不加,怎么舒服怎么来
    joesonw
        46
    joesonw  
       2021-05-03 12:17:32 +08:00 via iPhone
    引战帖?
    liuxing
        47
    liuxing  
    OP
       2021-05-03 12:23:46 +08:00
    @joesonw 哈哈哈 本来只想看看哪种风格的多,好像迎战了哈哈哈
    lancelock
        48
    lancelock  
       2021-05-03 12:38:30 +08:00
    不要把精力浪费在这种设计缺陷上,项目统一规范就行,让加就加,不加就不加
    LokiSharp
        49
    LokiSharp  
       2021-05-03 12:40:10 +08:00 via iPhone
    分号不是开了 eslint reformat 的时候自动就给加上了么
    CokeMine
        50
    CokeMine  
       2021-05-03 13:51:18 +08:00 via Android
    Standardjs 规范:不加
    airbnb 规范:加

    我:加
    craig
        51
    craig  
       2021-05-03 15:37:27 +08:00
    @Rocketer 哈哈哈,来打一架(不是
    ikas
        52
    ikas  
       2021-05-03 15:47:47 +08:00
    自己项目,爱加不加,多人项目,加,别问为什么
    varzy
        53
    varzy  
       2021-05-03 16:03:57 +08:00
    Prettier 真是个好东西。。。
    opengps
        54
    opengps  
       2021-05-03 16:42:21 +08:00
    习惯性加上号,因为有些时候不知不觉两行合并成一行,有分号保证代码不出合并成一条的问题
    henryhu
        55
    henryhu  
       2021-05-03 16:46:56 +08:00
    不加,为了美观
    KomiSans
        56
    KomiSans  
       2021-05-03 16:48:51 +08:00
    加上吧,我写 Java 和 C#习惯了,所以...,分号确实是为了能凸显出当前代码声明的结束
    xiebruce
        57
    xiebruce  
       2021-05-03 18:17:32 +08:00
    规则上是肯定要加的,不加虽然可以,但那只是浏览器兼容性强,可以用换行来识别语句而已。理论上,加了之后,会减少浏览器的分析时间,当然减少多少时间,这个没有实验过。
    anguiao
        58
    anguiao  
       2021-05-03 18:23:34 +08:00 via Android
    除非你不用 linter,不然这就是个纯粹的个人喜好问题。
    首先现在写 JS 基本上都要经过编译,再经过压缩以后,原始代码里有没有分号,对生成的代码并没有影响。
    然后如果是必须用分号隔开的情况,也都会提醒你,并不会因为这个出错。
    gdfsjunjun
        59
    gdfsjunjun  
       2021-05-03 22:48:00 +08:00
    习惯性加,我反而觉得加分号更美观吧,就像是句子必须加句号。可能受了 C++的影响,2333 。
    huijiewei
        60
    huijiewei  
       2021-05-03 23:23:45 +08:00
    我记得 15 年那会用 requirejs 方案的时候都是不加的,后来有了各种打包工具以后又流行加了

    所以我现在就是用 Prettier 推荐的方案

    ericgui
        61
    ericgui  
       2021-05-04 05:31:44 +08:00
    这个是个人主观选择的代码风格

    我司没有
    我个人项目有
    image72
        62
    image72  
       2021-05-04 08:09:04 +08:00
    最佳实践肯定是 nodejs 源代码,加分号,2 space 锁进。 谁敢说自己代码写的比 nodejs 源代码更好
    image72
        63
    image72  
       2021-05-04 08:13:25 +08:00   ❤️ 1
    包括几乎所有的 w3c,ECMA 提案中的实例代码,都是加分号,2 spacce 锁进
    zgl263885
        64
    zgl263885  
       2021-05-04 14:36:38 +08:00 via iPhone
    可能我比较菜,我的原则是,只要这些代码还有可能给人看,全加上。不光分号,if 语句后面的花括号我也是全加上。
    给我看的代码,如果省略了很多,导致我阅读障碍,我心里(甚至发出声)会骂人的,这写的什么玩意儿!
    jqtmviyu
        65
    jqtmviyu  
       2021-05-04 21:32:54 +08:00
    保护小拇指, 但单条语句会加大括号.
    liuxing
        66
    liuxing  
    OP
       2021-05-04 21:46:24 +08:00
    @jqtmviyu 程序员养生之道 哈哈哈
    aleen42
        67
    aleen42  
       2021-05-05 07:17:06 +08:00 via Android
    如果沒有強迫加,就很容易因 JS 分文件加載而導致前一個文件的最後一句與後一個文件的首句間缺少分號阻隔。這種情況下很多人習慣在每個文件頭都加一個分號以保證容錯
    msg7086
        68
    msg7086  
       2021-05-05 13:37:45 +08:00
    我写 VueJS,不加。
    我觉得更重要的问题不是加与不加,而是知道什么时候语言会给你加,什么时候会不给你加。
    毕竟 JS 里是有就算你不加分号也会给你强制加上的情况,所以如果你不懂,那等你写的时候就会有坑了。

    比如 return 后的换行是会强行给你加分号的。
    如果你不懂分号机制,就算是全程加分号,也无法避免下面的代码撞坑。
    return
    {
    data: 1
    };
    liuxing
        69
    liuxing  
    OP
       2021-05-05 17:20:34 +08:00
    @msg7086 哈哈哈 对 原文有讨论 ASI 机制 https://www.liuxing.io/blog/semicolons-in-javascript/
    msg7086
        70
    msg7086  
       2021-05-05 23:22:26 +08:00 via Android
    @liuxing 对。我的意思是,不能因为这东西迷惑就不去学习研究他。
    yl14786922106
        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

    执行下就知道 该不该加了。
    zzzmh
        72
    zzzmh  
       2021-05-06 09:57:01 +08:00
    问了前端说不加
    但我 java 出身写 vue 必须都加,不加浑身难受
    zhuweiyou
        73
    zhuweiyou  
       2021-05-06 14:15:51 +08:00
    这是引战话题.
    我习惯不加, 然后配合 prettier 规则格式化.

    其实重点不是加不加, 是团队需要统一风格比较好.
    zone10
        74
    zone10  
       2021-05-06 14:26:18 +08:00
    能不加分号的语言加分号像个憨猪, 点名 JS, Go, Scala, 当然, 老大是从 Java 过来的憨猪硬让你加也没办法
    BoringTu
        75
    BoringTu  
       2021-05-06 14:29:57 +08:00
    来来来,咱们聊聊两点:
    1. 缩进。A 需要视觉上缩进是 4 个字符距离,B 需要视觉上缩进是 2 个字符距离,C 需要视觉上缩进是 3 个字符距离。你们用空格来缩进的怎么处理?忽略个人需求,强制使用?
    2. 格式化代码。你们疯了吧?习惯性格式化代码是个什么习惯,不怕被打死?每个人的编辑器都不一样,A 把代码提交了,B 拉下来改东西然后格式化了一下代码也 push 了,这时候 B 的这个 commit 文件对比的意义何在?很可能全篇都是改动,怎么对比?
    nekochyan
        76
    nekochyan  
       2021-05-06 14:57:31 +08:00
    看个人习惯,建议加分号和 4 空格缩进;
    如果是团队就跟着团队走,我们公司都是加分号和 4 空格缩进的,所以我写代码的时候随时习惯格式化一下提交也没啥冲突
    hamptonchen
        77
    hamptonchen  
       2021-05-16 09:53:42 +08:00
    现在绝大多数前端项目都是在 Vue 、React 、Angular 等框架下开发的,这些其实可以不用加分号,因为代码最后打包的时候会被编译,编译器会自动帮你加上的
    wangtian2020
        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,
    不加分号
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   899 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:05 · PVG 06:05 · LAX 14:05 · JFK 17:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.