V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chaegumi
V2EX  ›  程序员

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

  •  
  •   chaegumi ·
    chaegumi · 2016-10-24 16:18:14 +08:00 · 17703 次点击
    这是一个创建于 2950 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在我印象中是要加的,但是最新在学习 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
        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  
       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   ·   实用小工具   ·   1197 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 23:08 · PVG 07:08 · LAX 15:08 · JFK 18:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.