Javascript 一行结束要不要加分号? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 I 生成的内容
chaegumi
V2EX    程序员

Javascript 一行结束要不要加分号?

  •  
  •   chaegumi
    chaegumi 2016-10-24 16:18:14 +08:00 18294 次点击
    这是一个创建于 3282 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在我印象中是要加的,但是最新在学习 electron 和 vue.js 时,文档和例子中的代码,很多发现都没有加,很不习惯,我写 php 的时候也加了。

    我想知道标准的做法。
    83 条回复    2018-03-06 15:28:36 +08:00
    chaegumi
        1
    chaegumi  
    OP
       2016-10-24 16:21:53 +08:00
    还有学习 html 的时候 单标签结束,印象中都是 这样的,/>,现在看的很多前端文档,里边又不要这样了。
    hanzichi
        2
    hanzichi  
       2016-10-24 16:24:38 +08:00
    PHP 是强制要加的吧, Javascript 不是必须的

    不过本人封号党 ...
    ansheng
        3
    ansheng  
       2016-10-24 16:26:18 +08:00
    单纯的 js 是要加上的,因为你用了构建工具,所以他会自动的帮你加上,
    zhuangtongfa
        4
    zhuangtongfa  
       2016-10-24 16:27:48 +08:00
    如果你写 JS 代码不喜欢带分号,而又搞不清什么时候必须加分号,可以这么做:在以 "("、"[" 、"/"、"+"、"-" 开头的语句前面都加上一个分号,如
    ```js
    ;(a + b).toString()
    ```
    66beta
        5
    66beta  
       2016-10-24 16:29:35 +08:00
    你需要 linter
    palmers
        6
    palmers  
       2016-10-24 16:31:38 +08:00
    js 语句结束应该加 `;`
    Keyes
      &bsp; 7
    Keyes  
       2016-10-24 16:35:40 +08:00
    @zhuangtongfa 这个总结 666
    dong3580
        8
    dong3580  
       2016-10-24 16:37:37 +08:00
    要加,不加一般情况也不会报错。然而会为以后留下隐患,可以上个代码检测工具了,
    nullizer
        9
    nullizer  
       2016-10-24 16:38:04 +08:00
    ES6 之后语法越来越像 python 了,箭头函数和一堆函数式风格语句加了分号越看越怪异。
    NemoAlex
        10
    NemoAlex  
       2016-10-24 16:47:59 +08:00   3
    1. JS 本身的语法,对于有明确换行的语句,结束的分号是允许不写的。
    2. 过去的主流是写分号,一方面是符合类 C 语言的语法,另一方面,某些工具对于没有分号的处理存在问题。
    3. 现在的主流工具,处理对于不加分号的写法,都没有问题。
    4. 现在的主流写法是不加。
    https://github.com/feross/standard/blob/master/RULES.md#semicolons
    imshawer
        11
    imshawer  
       2016-10-24 16:54:05 +08:00 via Android
    @chaegumi JS 是需要分号的,至于 HTML 加不加 “/” 是由 DOCTYPE 确定的。
    neoblackcap
        12
    neoblackcap  
       2016-10-24 16:57:24 +08:00
    @NemoAlex 然而括号开头的话,那么就要加,这样不如全部都加
    yangxiongguo
        13
    yangxiongguo  
       2016-10-24 17:11:42 +08:00
    大部分不写,有少部分是肌肉记忆写的,与我无关
    FrankFang128
        14
    FrankFang128  
       2016-10-24 17:14:49 +08:00 via Android
    加毛分号
    NemoAlex
        15
    NemoAlex  
       2016-10-24 17:16:17 +08:00
    @neoblackcap 以前这么做主要是为了避免压缩出错。而现在的主流压缩工具,都不需要加分号了。
    ijse
        16
    ijse  
       2016-10-24 17:16:48 +08:00
    你要的标准: http://standardjs.com/ 是不加分号的。

    一般由 eslint 检查,同时还能避免或提前发现一些问题。

    其实,没什么标准规范,团队达成一致并遵守即可。
    zpf124
        17
    zpf124  
       2016-10-24 17:29:17 +08:00
    @chaegumi
    1.分号 这个东西最好加上,因为
    一来,一部分的人的书写习惯,你不写他们看着不顺眼;
    二来, js 本身当初设计就很简单不严谨,所有 小程序啊 以及个别的上古浏览器对于这些解析会有各种奇怪的问题,所以现在开始出现 tc 啊 strict 模式这些东西。

    当然,如果上面这俩问题你不用考虑那就不用管他,加不加都可以,但记得一个项目里要统一,别前面不加,中间突然开始加分号,最后又没了。

    2 , 结束标记问题, 不需要加!
    这是当初的 XHTML 标准推广的玩意,要求标签必须有结束元标记必须带“/”,而且除了这个还要求 标签必须小写,属性必须有值且值必须被双引号包围。
    然而这个标准已经死了,你现在写按照 html5 的标准或者 html4.1 的就行了。
    zpf124
        18
    zpf124  
       2016-10-24 17:31:01 +08:00
    @imshawer html4 和 html5 都不强制要求必须有结束标记,那个是 XHTML 的标准。
    broker
        19
    broker  
       2016-10-24 17:34:00 +08:00
    可以参考下 Automatic Semicolon Insertion

    The source

    return
    a + b
    is transformed by automatic semicolon insertion into the following:

    return;
    a + b;

    The source

    a = b + c
    (d + e).print()

    is not transformed by automatic semicolon insertion, because the parenthesised expression that begins the second line can be interpreted as an argument list for a function call:

    a = b + c(d + e).print()
    neoblackcap
        20
    neoblackcap  
       2016-10-24 17:38:23 +08:00
    @NemoAlex 请参考 @broker 的例子,那是 http://standardjs.com/ 里面提到的,那个根本就是有歧义,不加分号无法区别作者的真正意图
    whimsySun
        21
    whimsySun  
       2016-10-24 17:41:54 +08:00
    如果都不加,下面的情况需要注意下
    ```
    expression...
    ;(function() {...})()

    ;[1,3,4].forEach((x) => {...})

    ```
    ityike
        22
    ityike  
       2016-10-24 18:22:04 +08:00
    能不写就不写,主要原因是懒
    missingbobo
        23
    missingbobo  
       2016-10-24 18:25:49 +08:00
    可以不加,但是建议加
    SuperMild
        24
    SuperMild  
       2016-10-24 18:32:53 +08:00 via iPad
    加或不加,各成一派,根据个人喜好选择即可。
    cai314494687
        25
    cai314494687  
       2016-10-24 18:36:15 +08:00
    可以不写分号,前提是你知道是有不写分号导致的坑。你可以看 这本书 https://book.douban.com/subject/25786138/ 第六条。
    txlty
        26
    txlty  
       2016-10-24 18:38:34 +08:00
    如果不写分号,代码压缩 /混淆等操作以后,很大几率会报错。
    paranoiagu
        27
    paranoiagu  
       2016-10-24 18:46:35 +08:00 via Android   1
    老程序员看完
    https://github.com/feross/standard/blob/master/RULES.md#semicolons

    这个,表示想辞职。
    chaegumi
        28
    chaegumi  
    OP
       2016-10-24 18:52:09 +08:00
    @paranoiagu

    我也是老程序员了,现在很热衷找标准做法,然后按标准做法做。
    murmur
        29
    murmur  
       2016-10-24 18:53:43 +08:00
    加分号是一种习惯 不加分号才麻烦
    另外标准是人订的 大家只要都按一个写就行了
    an168bang521
        30
    an168bang521  
       2016-10-24 19:02:50 +08:00
    我是不写不舒服斯基!
    好吧,我稍微有点强迫症,除了大括号外,我都加;
    否者看着不舒服,会感觉这段代码没有写完; if-else 语句,也会大括号;
    DiamondbacK
        31
    DiamondbacK  
       2016-10-24 19:05:40 +08:00   1
    尤雨溪解释了不用分号的理由 http://slides.com/evanyou/semicolons#/
    Cbdy
        32
    Cbdy  
       2016-10-24 19:19:42 +08:00
    现在看来我觉得这个和“ C 语言要不要另起一行大括号”一样,为了代码风格统一考虑统一就好了。
    xylitolLin
        33
    xylitolLin  
       2016-10-24 19:59:30 +08:00
    我不加
    Magician
        34
    Magician  
       2016-10-24 20:56:44 +08:00 via iPhone
    加上感觉好看点
    chiv2
        35
    chiv2  
       2016-10-24 21:07:35 +08:00
    没有所谓的标准,只有习惯的区别。我以前加,现在习惯不加。
    aaa0009
        36
    aaa0009  
       2016-10-24 21:08:31 +08:00
    反正最好都要压缩的,无所谓加/不加。
    zongren
        37
    zongren  
       2016-10-24 21:45:13 +08:00
    习惯不加,不加更简洁,没啥
    Arnie97
        38
    Arnie97  
       2016-10-24 22:14:16 +08:00 via Android   1
    由于我学 Javascript 前学过 VB 、 Pascal 、 Python 、 Ruby 等不写分号的语言和 C 、 C++、 Java 等写分号的语言,所以留下了带大括号(类 C 语法)的语言就要写分号的刻板印象,不写总感觉十分别扭。不知道大家有没有同感。
    jydeng
        39
    jydeng  
       2016-10-24 22:47:06 +08:00
    习惯写,我同时写 C#.
    tchekai704
        40
    tchekai704  
       2016-10-24 23:36:14 +08:00 via iPhone
    我就不说我写 python 还手动加分号, java 程序员 23333
    codelegant
        41
    codelegant  
       2016-10-24 23:43:25 +08:00 via Android
    拿不准就全部加上,降低风险。
    ByZHkc3
        42
    ByZHkc3  
       2016-10-25 00:58:16 +08:00
    不写分号能忍?
    kindjeff
        43
    kindjeff  
       2016-10-25 08:08:51 +08:00 via iPhone
    遇到(function(){})()这种东西在下一行的时候,上一行不加还识别不出来会报错
    aoaione
        44
    aoaione  
       2016-10-25 08:11:05 +08:00
    强迫症能忍?
    AdamChrist
        45
    AdamChrist  
       2016-10-25 08:11:35 +08:00
    从 java 转过来..一直都加..而且看到 webstorm 的警告..我也很难受..一定要加上才行..
    griffinqiu
        46
    griffinqiu  
       2016-10-25 08:15:15 +08:00 via iPhone
    总结:不加,只在(和[打行首的时候加前置分号, 即;(和;[
    Hyperion
        47
    Hyperion  
       2016-10-25 08:56:53 +08:00 via Android
    重点不是插还不是插,插是因为防止程序二义性,自动插分号插错地方。不插是因为想通了为什么要插。

    无论插不插都是语言风格,你明白为什么意义更大,没有谁比较智障谁比较高级的说法。个人是写的。

    盲目的传教很讨人厌。
    SourceMan
        48
    SourceMan  
       2016-10-25 08:59:44 +08:00 via iPhone
    不加,构建工具帮忙加
    winglight2016
        49
    winglight2016  
       2016-10-25 09:14:08 +08:00
    写 java 转过来,已经习惯加上分号了。。。
    ly710
        50
    ly710  
       2016-10-25 09:22:59 +08:00
    至少写 es6 的语法,不加分号之后代码要好看很多。
    Quaintjade
        51
    Quaintjade  
       2016-10-25 09:34:37 +08:00 via Android
    @ijse
    为啥用单引号啊?感觉既然 json 字符串用双引号, js 里也用双引号比较统一。
    好像 js 单引号双引号没有转义上的区别来着?
    Hyperion
        52
    Hyperion  
       2016-10-25 09:51:44 +08:00 via Android
    @Quaintjade 因为 es6 有了...
    xcodebuild
        53
    xcodebuild  
       2016-10-25 10:16:02 +08:00
    没有标准,这在 eslint 中是个可配置选项,团队保持一致即可
    unknownservice
        54
    unknownservice  
       2016-10-25 10:31:36 +08:00
    不是必须要加,但是不加有时候会有问题,所以还是加上为好。
    ZxBing0066
        55
    ZxBing0066  
       2016-10-25 10:58:55 +08:00
    https://google.github.io/styleguide/Javascriptguide.xml?showOne=Semicolons#Semicolons

    个人建议是添加 这样可以减少出现莫名其妙的问题的概率,毕竟一直加和选择加来说,一直加用脑少,出错概率小。。。 当然了这玩意见仁见智
    Phariel
        56
    Phariel  
       2016-10-25 11:01:09 +08:00 via Android
    强迫症,尤其是看着 IDE 里的缺少分号提示更是不能忍,通通加上
    yolio2003
        57
    yolio2003  
       2016-10-25 11:08:23 +08:00
    不要
    codeyung
        58
    codeyung  
       2016-10-25 11:10:13 +08:00
    一般不加
    fds
        59
    fds  
       2016-10-25 11:14:08 +08:00
    @Phariel 有些 IDE 把 lint 设置改一下,就会变成提示多余分号了 ;p
    onlyhot
        60
    onlyhot  
       2016-10-25 11:15:04 +08:00 via iPhone
    nino
        61
    nino  
       2016-10-25 11:16:04 +08:00
    python 也可以写分号,但从来没看人写过
    Tyanboot
        62
    Tyanboot  
    PRO
       2016-10-25 11:31:31 +08:00 via Android
    必须加,不加不好看。我同时还写 Python , c#, c++。
    root787
        63
    root787  
       2016-10-25 11:33:03 +08:00
    这种问题需要问?
    zwhu
        64
    zwhu  
       2016-10-25 11:40:07 +08:00
    vue 的作者是坚定的不加分号党,还是看社区提倡哪种了
    nigelvon
        65
    nigelvon  
       2016-10-25 12:03:22 +08:00
    按项目来看加与不加,统一就好。个人喜欢加分号。非常讨厌前面加分号的。
    chnhyg
        66
    chnhyg  
       2016-10-25 12:49:29 +08:00
    我的建议是加,原因有二。
    1 、如果不加分号,代码会有未知的隐患,即使有很完善的方案去避免隐患的发生,但是学习它也是需要成本的。
    2 、在团队开发中,肯定要去规范,加或是不加。不加的过渡到加,基本没有学习成本;加的过渡到不加,还要去学习,会对新人快速融入到团队产生一定的影响。
    xwartz
        67
    xwartz  
       2016-10-25 12:55:36 +08:00
    不加
    bigggge
        68
    bigggge  
       2016-10-25 13:05:37 +08:00
    webstorm 有警告,不加难受
    zongwan
        69
    zongwan  
       2016-10-25 13:08:38 +08:00
    不清楚 vue

    写 React 时 SublimeText 会提示我哪里应该加分号,哪里不用加。尤其碰到自动换行
    感觉更了解到代码结构了
    也避免了某些 bug
    Quaintjade
        70
    Quaintjade  
       2016-10-25 13:09:18 +08:00 via Android
    @Hyperion
    是说 ES6 引入的模板字符串吗?那个是 `` ,不是单 /双引号
    g0thic
        71
    g0thic  
       2016-10-25 13:10:05 +08:00
    不加
    Quaintjade
        72
    Quaintjade  
       2016-10-25 13:10:10 +08:00 via Android
    话说未压缩的 jQuery 还是用分号的。
    1340641314
        73
    1340641314  
       2016-10-25 13:45:28 +08:00
    以前有加分号,现在都不加分号了,没什么原因,主要还是因为懒
    miniwade514
        74
    miniwade514  
       2016-10-25 13:48:24 +08:00
    谁需要分号才能看清楚语句的开始和结束?
    Inside
        75
    Inside  
       2016-10-25 14:22:34 +08:00
    有这么难决定吗?凡是表达式语句就加以免表达式结果跟你的预期不一样,是完整的代码块就不加。
    dyingbleed
        76
    dyingbleed  
       2016-10-25 15:33:15 +08:00
    这是一个会引发圣战的问题……
    magicdawn
        77
    magicdawn  
       2016-10-25 19:35:10 +08:00
    mingyun
        78
    mingyun  
       2016-10-25 21:48:46 +08:00
    习惯加
    magicdawn
        80
    magicdawn  
       2016-11-08 18:11:45 +08:00
    分号党看了尤雨溪的 slide 之后就转非分号党了...
    http://slides.com/evanyou/semicolons#/18
    luwuer
        81
    luwuer  
       2017-09-04 16:55:17 +08:00
    ES6 不建议加,所以我不加了...
    Axurez
        82
    Axurez  
       2018-03-06 15:20:43 +08:00
    @NemoAlex 至少 React 和 Angular 是加的,TypeScript 也是加的。那个所谓的 Standard 只是这家公司叫 stdlib。
    Axurez
        83
    Axurez  
       2018-03-06 15:28:36 +08:00
    v8 和 node 也都是加的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2443 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 116ms UTC 15:30 PVG 23:30 LAX 08:30 JFK 11:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86