推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
fundebug

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

  •  
  •   fundebug · Sep 19, 2018 · 15833 views
    This topic created in 2971 days ago, the information mentioned may be changed or developed.
    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 replies  •  2018-09-26 09:58:06 +08:00
    Justin13
    Justin13
    Sep 19, 2018 via Android
    1
    个人写,但是这些不写分号的 bug 都可以绕过去。
    sohoorc
    sohoorc
    Sep 19, 2018
    2
    不写分号在错误定位上也有问题。
    Vhc001
    Vhc001
    Sep 19, 2018❤️8
    3
    看到 尤雨溪 到处喷 js 结尾写分号的人,我都不敢和别人说我我写 js 也在结尾写分号
    maichael
    maichael
    Sep 19, 2018
    4
    能不写就不写,交给 linter 和 formatter 解决,基本没出过问题。
    mars0prince
    mars0prince
    Sep 19, 2018
    5
    不写分号会有语法 BUG 的
    anjianshi
    anjianshi
    Sep 19, 2018
    6
    用 eslint 等工具,在这种情况下是会提示你的。

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

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

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

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

    function foo() { }

    foo
    `bar`
    Pastsong
    Pastsong
    Sep 19, 2018
    36
    无法忍受代码开头里出现
    ;( 或者 ;[

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

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

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


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

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

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

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

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

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

    ` - + / ( [

    这几个字符出现在行首时,前面补分号即可
    blackywkl
    blackywkl
    Sep 21, 2018
    92
    分号就像断句啊。。。。
    fundebug
    fundebug
    OP
    Sep 21, 2018❤️1
    93
    @ShareDuck 丑不丑这个不好说。。。有人觉得加分号丑。。。
    ShareDuck
    ShareDuck
    Sep 21, 2018
    94
    @fundebug #93 是啊,这是个很主观的意见。
    fundebug
    fundebug
    OP
    Sep 26, 2018
    95
    @SilentDepth 这样太麻烦了吧....很可能忘掉
    SilentDepth
    SilentDepth
    Sep 26, 2018
    96
    @fundebug #95 看起来是麻烦,但实际上这些情况能遇到的并不多,习惯即可。另外,现代 IDE (比如 WebStorm )可以自动识别这类情况并给出潜在错误提示
    fundebug
    fundebug
    OP
    Sep 26, 2018
    97
    @SilentDepth 那也行,只要没 BUG 就好
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   698 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 163ms · UTC 20:47 · PVG 04:47 · LAX 12:47 · JFK 15:47
    ♥ Do have faith in what you're doing.