V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
fundebug
V2EX  ›  JavaScript

JS 不写分号会出 BUG 的。。。

  •  
  •   fundebug · 2018-09-19 11:13:03 +08:00 · 14064 次点击
    这是一个创建于 2287 天前的主题,其中的信息可能已经有所发展或是发生改变。
    console.log("Hello, World!")
    [1,2,3].map(i=>console.log(i))
    

    报错"cannot read property '3' of undefined"

    那大家还写不写分号呢? https://blog.fundebug.com/2018/09/18/js-semicolon-bug/

    97 条回复    2018-09-26 09:58:06 +08:00
    Justin13
        1
    Justin13  
       2018-09-19 11:17:30 +08:00 via Android
    个人写,但是这些不写分号的 bug 都可以绕过去。
    sohoorc
        2
    sohoorc  
       2018-09-19 11:19:50 +08:00
    不写分号在错误定位上也有问题。
    Vhc001
        3
    Vhc001  
       2018-09-19 11:20:25 +08:00   ❤️ 8
    看到 尤雨溪 到处喷 js 结尾写分号的人,我都不敢和别人说我我写 js 也在结尾写分号
    maichael
        4
    maichael  
       2018-09-19 11:25:25 +08:00
    能不写就不写,交给 linter 和 formatter 解决,基本没出过问题。
    mars0prince
        5
    mars0prince  
       2018-09-19 11:25:43 +08:00
    不写分号会有语法 BUG 的
    anjianshi
        6
    anjianshi  
       2018-09-19 11:26:01 +08:00
    用 eslint 等工具,在这种情况下是会提示你的。

    所以不写分号,要么自己记住并注意这几个特殊情况,要么养成好习惯,给编辑器加一个默认开启的 eslint,配置一些基本的 rule 即可,这样还能避免其他一些手误写错的代码。

    要是不想开 eslint,也怕记不住这些特殊情况,那就写分号。
    webxh6
        7
    webxh6  
       2018-09-19 11:30:52 +08:00
    想写就写,项目能写出来,代码能够优化好。
    就看你自己怎么对待啦
    xycool
        8
    xycool  
       2018-09-19 11:38:39 +08:00 via iPhone   ❤️ 1
    我 tslint 的规则是不写分号
    TomatoYuyuko
        9
    TomatoYuyuko  
       2018-09-19 11:40:02 +08:00   ❤️ 1
    已经养成习惯写了,也不费事,看到光屁股代码浑身难受
    zhzer
        10
    zhzer  
       2018-09-19 11:41:16 +08:00 via Android
    不写分号在拼接代码的时候最容易报错,但是你不用 lint 么……
    xenme
        11
    xenme  
       2018-09-19 11:49:58 +08:00 via iPhone
    顺道问个问题,像 webpack build 之后的代码很多都用逗号,debug 的时候如何去方便的 debug
    lxrmido
        12
    lxrmido  
       2018-09-19 11:53:11 +08:00
    @xenme
    SourceMap
    xenme
        13
    xenme  
       2018-09-19 11:54:53 +08:00 via iPhone
    @lxrmido 没有 sourcemap

    类似上面不写分号多行合并一行的,有啥黑科技或者小技巧么
    wu67
        14
    wu67  
       2018-09-19 11:56:55 +08:00
    不写, 交给 webpack 那一套来解决就行了, 反正 npm 一跑, 最后得到的代码还是会给加上分号
    Sparetire
        15
    Sparetire  
       2018-09-19 11:58:52 +08:00 via Android
    不写可能出 bug,写了也可能出 bug,由于自动分号插入机制的存在,最好是在工具链层面处理才是正道,至于写不写看个人喜好
    neverandy
        16
    neverandy  
       2018-09-19 11:59:06 +08:00
    还是看个人习惯吧。两种方式都不应该有什么优越感。不写分号带来的问题,也有解决的方案。我个人还是写分号的,写习惯了。
    SuperMild
        17
    SuperMild  
       2018-09-19 11:59:13 +08:00
    不写分号要用 linter,用 linter 是比写不写分号更重要的好习惯。就算写分号也要用 linter。
    kingwl
        18
    kingwl  
       2018-09-19 12:01:12 +08:00
    明明是 feature🤷🏻‍♂️
    98jiang
        19
    98jiang  
       2018-09-19 12:02:32 +08:00
    写 java 习惯加 2333
    miyalee
        20
    miyalee  
       2018-09-19 12:02:55 +08:00
    不写,靠插件自动补齐
    Desperado2018
        21
    Desperado2018  
       2018-09-19 12:04:42 +08:00   ❤️ 2
    如果下一行是以[]或者()开头,那么上一行结尾或者下一行开头需要写;
    其他情况皆可不写。
    phpcxy
        22
    phpcxy  
       2018-09-19 12:05:06 +08:00
    作为一个 PHP 程序员,写 JS 的时候都写分号是很合理的~
    tanranran
        23
    tanranran  
       2018-09-19 12:05:36 +08:00
    @miyalee #20 #20 啥插件
    pabupa
        24
    pabupa  
       2018-09-19 12:06:46 +08:00
    语法就不是法了?
    bertonzh
        25
    bertonzh  
       2018-09-19 12:13:46 +08:00
    即使你写分号,你能保证你的代码每个结尾都不会漏掉分号吗?个人感觉这比都不加分号要难很多。
    如果保证不了,还是需要 eslint。但是既然都用 eslint 了,这个 ‘ BUG ’ 还算问题么?
    kernel
        26
    kernel  
       2018-09-19 12:14:01 +08:00   ❤️ 2
    楼主在不了解不写分号需要在(和[前加;的基本规则下直接开喷也是醉了
    另外现在都上 lint,没有出 BUG 这种事
    CodeMan27
        27
    CodeMan27  
       2018-09-19 12:20:46 +08:00
    if( console.log("hello-world") ) {}
    没分号。
    bumz
        28
    bumz  
       2018-09-19 12:22:43 +08:00
    <blockquote>尤雨溪 到处喷 js 结尾写分号的人</blockquote>

    所以应该开头写分号?[滑稽]
    lzvezr
        29
    lzvezr  
       2018-09-19 12:24:41 +08:00 via iPhone
    typescript 不加分号,编译自动加
    snw
        30
    snw  
       2018-09-19 12:25:44 +08:00 via Android
    我记得建议是行开头是这类括号的话,在前面加分号
    hronro
        31
    hronro  
       2018-09-19 12:29:04 +08:00
    看看 standard js 中对分号使用的定义吧:
    https://standardjs.com/rules.html#semicolons
    imn1
        32
    imn1  
       2018-09-19 12:34:35 +08:00
    很久以前,上世纪,上线就出错,查了半天本地没问题啊,看网上源码,发现换行符变了……
    后来代码行尾检查也成为日常
    当然那时没有什么 lint 工具
    coolcoffee
        33
    coolcoffee  
       2018-09-19 12:36:46 +08:00
    prettier 了解一下, 你代码不写分号可以,但是可以做 pre-commit 自动触发格式化。
    tinytin
        34
    tinytin  
       2018-09-19 13:36:49 +08:00 via iPhone
    不写,除非必须得写的地方,由 tslint 控制
    kingwl
        35
    kingwl  
       2018-09-19 13:38:43 +08:00
    @Desperado2018

    function foo() { }

    foo
    `bar`
    Pastsong
        36
    Pastsong  
       2018-09-19 13:41:20 +08:00
    无法忍受代码开头里出现
    ;( 或者 ;[

    所以我选择写分号
    bufpay
        37
    bufpay  
       2018-09-19 13:42:10 +08:00
    还是写一些,不然压缩后可能会出问题
    pkoukk
        38
    pkoukk  
       2018-09-19 13:44:51 +08:00
    @bertonzh 你别说,还真能保证。就跟写几行之后无意识的 ctrl+s 一样,这是条件反射
    UIXX
        39
    UIXX  
       2018-09-19 13:59:04 +08:00
    1、团队代码,风格一致优先,入乡随俗
    2、个人代码,加不加都行

    风格问题有什么好讨论的
    kernel
        40
    kernel  
       2018-09-19 13:59:30 +08:00 via Android
    @bufpay 神他妈压缩有问题,你见过哪个智障压缩器会出这种问题
    qiaobeier
        41
    qiaobeier  
       2018-09-19 14:09:11 +08:00
    不写,反正编译器会自己加。 写不写其实无所谓,就怕有写有不写,那就看的难受了
    qiaobeier
        42
    qiaobeier  
       2018-09-19 14:12:04 +08:00
    @Pastsong js 文件或者代码块开头加分号是推荐写法
    EPr2hh6LADQWqRVH
        43
    EPr2hh6LADQWqRVH  
       2018-09-19 14:20:27 +08:00
    @qiaobeier 谁推荐给你的,是不是尤雨溪

    能找出一个推荐不写分号的,不是尤雨溪的大佬吗
    otakustay
        44
    otakustay  
       2018-09-19 14:23:44 +08:00
    @avastms hax
    xfriday
        45
    xfriday  
       2018-09-19 14:30:03 +08:00
    不写原生 js 就行了,各大编译器 ts, babel,自己补齐
    SeanChense
        46
    SeanChense  
       2018-09-19 14:31:35 +08:00
    JS 不是法外之地
    icris
        47
    icris  
       2018-09-19 14:32:22 +08:00
    @hronro #31
    我一个格式化每一行都加上分号有什么不好,要按它标准来写 `;[1, 2, 3].forEach(bar)` ?那为什么 ESLint semi 默认值 always ?
    fundebug
        48
    fundebug  
    OP
       2018-09-19 14:44:36 +08:00
    @Vhc001 我写不写分号关他什么事,叫他一边凉快去
    kernel
        49
    kernel  
       2018-09-19 16:53:41 +08:00
    @avastms 现在 JS 大佬很多都推荐不写分号,你去看看 redux 这种最热门的库都没分号


    另外有人觉得[前加;丑,你去看看你写的所有代码最前面有[的有几行?为了这几行要给所有行加分号???
    mcfog
        50
    mcfog  
       2018-09-19 16:57:28 +08:00
    @xenme 有个语句叫 debugger; 了解一下
    mewpoi
        51
    mewpoi  
       2018-09-19 17:20:47 +08:00
    加分号真的很丑,已经 3-4 年不写分号了,分号让打包自己去处理,而且验证也 semi: 2, never 了,所以项目里如果发现别人写分号会报错,这个问题就好像为什么 js 以前用都""双引号现在改用''单引号的问题一样,就是因为双引号要按两个键,而单引号只要一个键这么简单,开发本来就已经很繁琐了,就不要给自己代码增加负担,结尾能不用分号就不要用,除非你不会打包,如果纯原生的去写,那么加分号无可厚非
    vevlins
        52
    vevlins  
       2018-09-19 17:29:52 +08:00 via Android
    所以,这个问题报错的原因是啥
    adminii
        53
    adminii  
       2018-09-19 17:35:17 +08:00
    必须写,不然遇到哪些风骚的代码,像前端那些一旦压缩就 6666 了
    EvilCult
        54
    EvilCult  
       2018-09-19 18:03:05 +08:00
    外行人有个疑问: 用 lint 后,是不是该提示:map 要 return 了??
    icris
        55
    icris  
       2018-09-19 18:24:16 +08:00
    @kernel #49
    react 有分号,是否说明 Facebook 不是大佬且 react 不够热门?
    easylee
        56
    easylee  
       2018-09-19 18:33:39 +08:00 via Android
    写久了 C 和 Java ……不写分号表示难以接受……我连 py 都是加分号的……
    xianxiaobo
        57
    xianxiaobo  
       2018-09-19 18:35:56 +08:00
    习惯写上,看着也舒服些。
    kernel
        58
    kernel  
       2018-09-19 19:27:38 +08:00
    @icris 老的库和公司已经有很多现有代码和定下风格标准当然不会再改
    xiangyuecn
        59
    xiangyuecn  
       2018-09-19 19:51:46 +08:00
    加分号不加分号都是对的,只要运行过程和最终结果符合预期就是 ok 的,管你是不加分号还是漏了分号。

    {我是要求加分号}; 不加分号的代码看起来就像光着屁股,没错,看 java 就像是光着屁股的。

    写花里胡哨的格式都可以,反正最终压缩成一坨代码,嘿嘿
    kisnows
        60
    kisnows  
       2018-09-19 21:23:11 +08:00
    所有括号前加上分号就好了
    liuguang
        61
    liuguang  
       2018-09-19 21:37:14 +08:00
    当然写了,否则压缩时,会报错的
    likaka
        62
    likaka  
       2018-09-19 21:45:08 +08:00
    学过 java 的都会写,js 不写;,电脑自动加,但电脑傻会加错
    gbin
        63
    gbin  
       2018-09-19 21:52:20 +08:00 via Android   ❤️ 2
    曾经我在 V2EX 上调侃了一下不写分号的人,结果我换了一个 ID
    fanyingmao
        64
    fanyingmao  
       2018-09-19 22:00:32 +08:00 via Android
    从 Java 转过来,JS 语法太随意了,不写分号代码看不下去。
    fobven
        65
    fobven  
       2018-09-19 22:09:46 +08:00
    遇到几个特殊字符在前面加上分号就行了,其余地方统统没必要加,写分号就是浪费时间。
    lyhiving
        66
    lyhiving  
       2018-09-19 22:17:57 +08:00 via iPhone
    不写分号的都是初级入门。
    PythonAnswer
        67
    PythonAnswer  
       2018-09-19 22:20:51 +08:00 via iPhone
    偷懒,我不写分号
    royzxq
        68
    royzxq  
       2018-09-20 01:51:30 +08:00
    #66 攻击不可取, 通常这种情况需要手动在上一行结尾或者下一行开始加上分行

    建议在下一行开始的地方加,不然你上一行一修改又要翻车了。
    ```
    ;[1, 2,0, 3].filter(it => !!it)
    ```
    tsui
        69
    tsui  
       2018-09-20 06:09:11 +08:00
    @kernel redux 相当小的库了,没几行代码,你看看 react
    picture2200
        70
    picture2200  
       2018-09-20 06:55:24 +08:00 via Android
    以前写 juery 时先打一个;,就防止这种问题出现
    brickyang
        71
    brickyang  
       2018-09-20 07:37:52 +08:00 via iPhone
    @kernel #49 你为什么敢用「最」热门来定义 Redux ?其他 js 项目的 star 比它少吗?
    fy
        72
    fy  
       2018-09-20 09:28:46 +08:00
    @avastms #43 语法风格:Standard
    我也不知道这个被称为“ JavaScript 标准语法风格”的文档是谁干的。
    shintendo
        73
    shintendo  
       2018-09-20 09:34:21 +08:00
    不喜欢写分号,一眼看过去脏兮兮的。
    关键问题在于,ASI 不会因为你写了分号而关闭,解释器不会因为你写了分号,而知道你没写的地方是真的不想要分号。
    zhwithsweet
        74
    zhwithsweet  
       2018-09-20 09:37:16 +08:00
    我看你你这个头像,就怕你来一波广告。(逃
    fundebug
        75
    fundebug  
    OP
       2018-09-20 09:57:26 +08:00
    @zhwithsweet 小姐姐头像设计得好,自带广告效应
    autoxbc
        76
    autoxbc  
       2018-09-20 10:06:08 +08:00 via iPhone
    加分号:我的语句正确结束了,我句首不加,你们别来害我

    不加,特例加:你害我也给你挡住,我句尾不加,后边的爱死不死

    看起来是两种做人方式
    shyrock
        78
    shyrock  
       2018-09-20 10:10:54 +08:00   ❤️ 1
    一切有利于减少 bug 的规则都是好规则,为了减少 bug,键盘磨损和代码美观算个 P。
    w3sy
        79
    w3sy  
       2018-09-20 10:26:53 +08:00
    Swift 开发看到你们的讨论,瑟瑟发抖。
    898601566
        80
    898601566  
       2018-09-20 10:29:17 +08:00
    这是个习惯,和语言无关
    marcong95
        81
    marcong95  
       2018-09-20 10:35:29 +08:00
    上个 Linter 有这么痛苦么,为毛这种东西还值得撕。。。
    Yuicon
        82
    Yuicon  
       2018-09-20 10:41:14 +08:00
    我 js 和 java 写分号,py 和 go 不写 都是入乡随俗 好像只有 js 有这个争论
    wmhx
        83
    wmhx  
       2018-09-20 10:44:34 +08:00
    加分号,肯定不会出现莫名其妙的问题, 不加就不好说了; 如果你是看前人的代码, 你能接受那一种?
    fundebug
        84
    fundebug  
    OP
       2018-09-20 11:12:32 +08:00
    @marcong95 我也觉得这个没啥好争的...用个工具自动加分号不出 BUG 就好了...
    semiwhale
        85
    semiwhale  
       2018-09-20 11:39:06 +08:00
    @Yuicon 因为 js 一些情况下不写分号会有 bug,所有才有这个争论。
    lincanbin
        86
    lincanbin  
       2018-09-20 11:57:19 +08:00
    不想写分号,也得记得用 Lint。
    Fury718
        87
    Fury718  
       2018-09-20 12:21:00 +08:00   ❤️ 1
    @vevlins console.log("Hello, World!") 返回的值是 undefined 结合下一条语句是 undefined[1,2,3] 在这里报错了
    vsomeone
        88
    vsomeone  
       2018-09-20 12:33:28 +08:00
    我个人感觉还是加分号的比较好。标准更新要保持兼容性,肯定是首先保证不影响写了分号的代码。如果未来新标准又加入了一个新的运算符号(虽然可能性很小),未加分号的代码很有可能就会产生歧义。至于说编程减负的,其实分号写习惯了根本就不是多大的负担。就如同 Ctrl + S 这个快捷键按着按着就成习惯,自己是不会感到刻意的(说完我就按了一下…)。
    ShareDuck
        89
    ShareDuck  
       2018-09-20 12:44:43 +08:00 via Android
    加!习惯了。不加觉得丑。
    adjusted
        90
    adjusted  
       2018-09-20 13:01:35 +08:00   ❤️ 1
    我以为有了 prettier 就没有人争论这个了,我还是错了。。。
    SilentDepth
        91
    SilentDepth  
       2018-09-20 13:54:03 +08:00
    基本上:

    ` - + / ( [

    这几个字符出现在行首时,前面补分号即可
    blackywkl
        92
    blackywkl  
       2018-09-21 08:32:26 +08:00
    分号就像断句啊。。。。
    fundebug
        93
    fundebug  
    OP
       2018-09-21 11:03:21 +08:00   ❤️ 1
    @ShareDuck 丑不丑这个不好说。。。有人觉得加分号丑。。。
    ShareDuck
        94
    ShareDuck  
       2018-09-21 12:51:13 +08:00
    @fundebug #93 是啊,这是个很主观的意见。
    fundebug
        95
    fundebug  
    OP
       2018-09-26 09:53:30 +08:00
    @SilentDepth 这样太麻烦了吧....很可能忘掉
    SilentDepth
        96
    SilentDepth  
       2018-09-26 09:56:24 +08:00
    @fundebug #95 看起来是麻烦,但实际上这些情况能遇到的并不多,习惯即可。另外,现代 IDE (比如 WebStorm )可以自动识别这类情况并给出潜在错误提示
    fundebug
        97
    fundebug  
    OP
       2018-09-26 09:58:06 +08:00
    @SilentDepth 那也行,只要没 BUG 就好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1147 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 18:35 · PVG 02:35 · LAX 10:35 · JFK 13:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.