JS 不写分号会出 BUG 的。。。 - V2EX
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 14569 次点击
    这是一个创建于 2579 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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  
       218-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     Solana     2685 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 14:09 PVG 22:09 LAX 07:09 JFK 10:09
    Do have faith in what you're doing.
    ubao 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