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

纠结 JS 变量用 let 还是 const 定义

  •  1
     
  •   mytry · 2018-12-19 19:40:38 +08:00 · 9477 次点击
    这是一个创建于 2159 天前的主题,其中的信息可能已经有所发展或是发生改变。

    理论上说能用 const 的地方尽量用 const 当然是最好的,但发现用了 const 之后有些地方没之前优雅了。比如某个程序有很多这样的代码:

    let a = ...
    if (a > 0) {
      ...
    }
    

    本来两个 a 都是工整对齐的,换成 const 变成:

    const a = ...
    if (a > 0) {
      ...
    }
    

    感觉没以前美观了😂

    还有本来一堆变量都是 let 定义的,现在有些是 let 有些是 const 定义:

    const num = arr.length;
    let i = 0;
    
    const map = {};
    ...
    

    看起来也没有统一用 let 那么整齐了。。。而且有些 let 的初始值依赖 const 的值,也没法分开归类定义。。。强迫症患者表示好纠结这个问题~

    99 条回复    2018-12-21 13:03:46 +08:00
    bajie
        1
    bajie  
       2018-12-19 19:49:33 +08:00   ❤️ 7
    let 定义变量
    const 定义常量
    而且。。代码优雅的意思是对齐吗。。。。。
    kba977
        2
    kba977  
       2018-12-19 19:51:13 +08:00 via iPhone
    变量能用 const?
    shiny
        3
    shiny  
       2018-12-19 19:51:19 +08:00   ❤️ 14
    MeteorCat
        4
    MeteorCat  
       2018-12-19 19:55:19 +08:00 via Android   ❤️ 1
    这戏怎么这么多,黑人问号
    arrow8899
        5
    arrow8899  
       2018-12-19 19:55:35 +08:00   ❤️ 1
    你怕不是把 const 和 var 搞混了吧。。。
    Nasei
        6
    Nasei  
       2018-12-19 19:56:13 +08:00 via Android   ❤️ 1
    竟然纠结这种对齐…让我想到了十几年前的 c 代码里,有一种风格是从 = 号对齐的
    rrfeng
        7
    rrfeng  
       2018-12-19 19:57:27 +08:00 via Android
    @Nasei
    现在有时候也会写这样的代码啊…哈哈哈哈哈
    qwertyzzz
        8
    qwertyzzz  
       2018-12-19 19:57:28 +08:00
    有点优雅的
    dapang1221
        9
    dapang1221  
       2018-12-19 19:58:23 +08:00
    工整对其这 4 个字我想了半分钟才明白是这么个对齐法……
    iiii
        10
    iiii  
       2018-12-19 19:58:40 +08:00 via Android
    自己代码里基本上全是 const
    codermagefox
        11
    codermagefox  
       2018-12-19 19:59:59 +08:00 via iPhone   ❤️ 1
    代码对齐 !==优雅
    可读性==优雅
    逻辑清晰===优雅
    Kirscheis
        12
    Kirscheis  
       2018-12-19 20:00:16 +08:00 via Android
    为什么 const 后面还能有分支?
    dd0754
        13
    dd0754  
       2018-12-19 20:01:40 +08:00
    ShangbaizeDaoye
        14
    ShangbaizeDaoye  
       2018-12-19 20:02:04 +08:00
    ???
    你 const 个 a,然后再让 a 比较大小?
    说正经的,const 定义的是常量。。
    而且你要是强迫症犯了,为何不让 const 定义的放一起,let 定义的放一起,然后两组用空行隔开呢?
    zbinlin
        15
    zbinlin  
       2018-12-19 20:02:30 +08:00
    在 js 里,一般 let 用来定义的变量可以改变的,const 用来定义的变量不可改变的。
    所以尽量用 const,如果需要用 let,还是要用的。当然,如果 do expression 可以进入标准的话,用 let 的场景就更少了。
    mytry
        16
    mytry  
    OP
       2018-12-19 20:05:35 +08:00
    @ShangbaizeDaoye
    const 只是定义后不再修改而已,并非静态可知值。比如:

    const n = Math.random() > 0.5 ? A() : B();

    都是很常见的。
    yunye
        17
    yunye  
       2018-12-19 20:06:04 +08:00
    学点基础再来说优雅吧
    mytry
        18
    mytry  
    OP
       2018-12-19 20:09:13 +08:00
    当然最终结果,还是把能用 const 的地方都换成了 const,毕竟不对齐的地方太多了,而已这种小细节比起健壮性算不上什么,只是偶尔觉得有些纠结而已。。。

    另外代码里很多地方用了 const 下一行再 await,这下反而更对齐了 233333333
    tabris17
        19
    tabris17  
       2018-12-19 20:09:32 +08:00
    我觉得作为一个优雅的英语使用者,应该用 assign a = ...
    ShangbaizeDaoye
        20
    ShangbaizeDaoye  
       2018-12-19 20:14:05 +08:00
    @mytry 这样的话,那还是建议多关注易读性和逻辑,过于纠结这种没必要的对齐,到最后可能会事倍功半。。
    大不了也可以像我上面说的 const 放一起,let 放一起。。
    lscho
        21
    lscho  
       2018-12-19 20:18:12 +08:00 via iPhone
    能用 const 的尽量用 const
    Mutoo
        22
    Mutoo  
       2018-12-19 20:21:09 +08:00
    人生苦短,我用 let (可以少打两个字母)
    mytry
        23
    mytry  
    OP
       2018-12-19 20:44:47 +08:00
    见过个最极端的,把 for 循环因子都用 const,大概是这么实现的。。。

    ```js
    function* range(beg, end, step = 1) {
    for (let i = 0; i < end; i += step)
    yield i;
    }

    for (const i of range(0, 10, 2)) {
    console.log(i);
    }
    ```
    Jasonwxy
        24
    Jasonwxy  
       2018-12-19 20:46:37 +08:00
    这有什么好纠结的。。我都是用 const,如果某个变量之后可能要变化,就用 let。我之前也强迫症,一下升级了全部项目依赖。。然后,之后升级依赖都小心翼翼的。。
    autoxbc
        25
    autoxbc  
       2018-12-19 21:08:31 +08:00
    统计了一下自己的小项目,const 和 let 的用量是 14:1
    aleung
        26
    aleung  
       2018-12-19 21:20:50 +08:00   ❤️ 1
    代码里尽可能使用 const,而不用 let。

    特别是使用 lodash 之类的函数库辅助之后,你会发现很少情况下非用 let 不可。做到这点,是函数式编程的初级阶段。
    AlloVince
        27
    AlloVince  
       2018-12-19 21:26:37 +08:00   ❤️ 1
    dcatfly
        28
    dcatfly  
       2018-12-19 21:28:26 +08:00
    看到楼主第一段代码的工整对齐。。我笑了。。
    seki
        29
    seki  
       2018-12-19 21:29:37 +08:00
    需要重定义就用 let,不需要重定义就是 const
    看了一下楼主的发帖记录,觉得可能是缺铜币了
    Wincer
        30
    Wincer  
       2018-12-19 21:47:16 +08:00
    楼主这么纠结建议使用 Typescript,编译器会告诉你什么时候该用 const
    mytry
        31
    mytry  
    OP
       2018-12-19 21:49:54 +08:00
    @Wincer ts 都用了快 7、8 年了,试验版就开始用~ 然而并不会提示,只是给 const 赋值会报错而已。
    mytry
        32
    mytry  
    OP
       2018-12-19 21:51:13 +08:00
    应该没有 7 8 年,之前用的是一种奇怪的强类型语言叫 haxe...
    airyland
        33
    airyland  
       2018-12-19 21:56:42 +08:00
    楼主重新定义了代码对齐。。
    Nick66
        34
    Nick66  
       2018-12-19 21:58:00 +08:00
    你该重新学习 es6 语法了
    ydirel
        35
    ydirel  
       2018-12-19 22:01:42 +08:00
    eslint 了解一下
    FakeLeung
        36
    FakeLeung  
       2018-12-19 22:01:52 +08:00 via Android
    let 是用于定义会修改变量。const 用于定义不会被改变的。改变指的是内存地址。不一定是值。
    a62527776a
        37
    a62527776a  
       2018-12-19 22:04:32 +08:00 via Android
    ???
    Wincer
        38
    Wincer  
       2018-12-19 22:10:57 +08:00
    @mytry tslint 会告诉
    emmmlucky
        39
    emmmlucky  
       2018-12-19 23:31:26 +08:00 via Android
    建议使用 eslint 或 tslint,let 定义的变量之后没有重新赋值就会报错。
    belin520
        40
    belin520  
       2018-12-19 23:35:20 +08:00 via iPhone
    建议楼主重新学习下 const 和 let 的用法再来思考你的疑惑
    crazykay
        41
    crazykay  
       2018-12-19 23:38:37 +08:00
    我写的时候的命名通常都比较长, 反正看起来非常不"优雅", 但是很久之后再来改代码, 不至于看不懂
    Everyman
        42
    Everyman  
       2018-12-19 23:45:13 +08:00
    你是不是对优雅和强迫症有什么误解?
    严格遵守规范,能用 const 用 const,不能用 const 采用 let,才叫优雅。
    能用 const 用了 let,才叫必死强迫症。
    lastpass
        43
    lastpass  
       2018-12-20 00:00:28 +08:00 via Android
    可以试着将对齐交给代码美化工具。自己关注于逻辑嘛。这样写的又快有好看。就有更多时间摸鱼了。(≧▽≦)
    codehz
        44
    codehz  
       2018-12-20 00:10:24 +08:00
    @Nasei #6 现在这种对齐也很常见,以至于各种格式化插件都有相关支持,比如 clang-format
    zhuangzhuang1988
        45
    zhuangzhuang1988  
       2018-12-20 00:14:47 +08:00
    lint 打开就好了
    w3cay
        46
    w3cay  
       2018-12-20 00:16:25 +08:00   ❤️ 2
    还是需求太少
    Sivan
        47
    Sivan  
       2018-12-20 00:19:08 +08:00 via iPhone
    是我误会了,代码对齐原来是垂直对齐……🤪
    Vegetable
        48
    Vegetable  
       2018-12-20 00:47:41 +08:00 via Android   ❤️ 1
    js 对可变不可变约束的不是那么严格,大家观点不同正常。我是典型的 let 党。
    认为应该慎用 const,相比 const 和 let,前者更多了一层约束,这种常量在代码中应该只占很小的一部分,因为他们往往有特别的含义,应该是明确的数值字符串之类或全局唯一的对象等,const 应该提示读代码的人,这是一个很关键的变量,不要尝试在运行时改变他,而不是单纯的告诉 v8 这个不能改。如果能用 const 用的太多,便失去了向人传递信息的能力了。
    zhy0216
        49
    zhy0216  
       2018-12-20 00:57:50 +08:00
    我们只用 const
    yanaraika
        50
    yanaraika  
       2018-12-20 01:18:26 +08:00 via Android
    @Vegetable 你把编译期已知的常量都用 CAPITAL_LETTER 就好了,js 里的 const 指的就是 immutable,和你说的编译期已知是两个不同的概念
    CODEWEA
        51
    CODEWEA  
       2018-12-20 04:38:31 +08:00
    let 因为 let 就三个字母
    @mytry
    wdv2ly
        52
    wdv2ly  
       2018-12-20 07:34:02 +08:00 via Android
    那 let 和 var 区别是啥,我没学过 js,一般都是 var 到底
    passerbytiny
        53
    passerbytiny  
       2018-12-20 09:09:15 +08:00
    可以做,并不代表你能做。

    Java,final static 定义的非不可变类的常量,其内部的属性也是可变的,然而你要是敢这么用,会被打死。

    JS 因为万物皆对象,所以你将一个方法赋值给 const 常量,来实现 const 定义可变值的常量的目的,在语法上是允许的。然而你真得能这样用吗?
    galikeoy
        54
    galikeoy  
       2018-12-20 09:15:37 +08:00
    @seki 绝壁他么缺铜币了,const or let? 都快 9102 年了 破事水
    heyOhayo
        55
    heyOhayo  
       2018-12-20 09:21:13 +08:00
    都 9102 了,还有人问这么无聊的问题
    Heroy
        56
    Heroy  
       2018-12-20 09:21:55 +08:00
    ChefIsAwesome
        57
    ChefIsAwesome  
       2018-12-20 09:25:12 +08:00 via Android
    屁影响没有。现在都分模块写,一个模块文件就写那么点代码,模块导出的变量在引入时又自动变成常量,哪来的乱改常量的可能。
    Terry05
        58
    Terry05  
       2018-12-20 09:39:15 +08:00
    楼主写 JS 肯定是不刷 ESLint 的,鉴定完毕
    fundebug
        59
    fundebug  
       2018-12-20 09:41:29 +08:00
    《代码简洁之道》貌似没有必须对其这个说法吧。。。
    ZehaiZhang
        60
    ZehaiZhang  
       2018-12-20 09:42:13 +08:00
    讲究人
    fundebug
        61
    fundebug  
       2018-12-20 09:43:36 +08:00
    @ChefIsAwesome 用 const 至少可以提醒同事不要乱改变量,提高可读性。
    JackyCDK
        62
    JackyCDK  
       2018-12-20 09:43:45 +08:00
    const 定义常量
    let 定义变量
    不是 ES6 基础吗....
    tairan2006
        63
    tairan2006  
       2018-12-20 09:46:04 +08:00
    楼主脑子里面在想什么。。。感觉难以理解
    SuAlien
        64
    SuAlien  
       2018-12-20 09:48:44 +08:00
    楼主,额额额额额额,你有洁癖么?
    UnderTaker666
        65
    UnderTaker666  
       2018-12-20 09:49:49 +08:00
    楼主是个萌新吗,我还是新手的时候也是纠结“代码整洁”
    flyingghost
        66
    flyingghost  
       2018-12-20 09:59:39 +08:00
    不要纠结用什么关键字了。以后代码这么写,肯定工整对齐美观优雅。/手动狗头

    <table>
    <tr>
    <td>const</td><td colspan=2> a = 1</td>
    </tr>
    <tr>
    <td>if</td><td>(a>0)</td><td>{</td>
    </tr>
    <tr>
    <td colspan=3>}</td>
    </tr>
    <table>
    lwlipuyang
        67
    lwlipuyang  
       2018-12-20 10:00:54 +08:00
    你可能是个傻子...
    besto
        68
    besto  
       2018-12-20 10:05:59 +08:00
    @Nasei 现在依然有, 并不是个坏习惯. 驱动里往往几十行一起赋值
    YYYeung
        69
    YYYeung  
       2018-12-20 10:08:11 +08:00
    能用 const 的地方用了 let, eslint 会骂人的。。。
    frankkai
        70
    frankkai  
       2018-12-20 10:27:06 +08:00
    "本来两个 a 都是工整对齐的"
    "感觉没以前美观了"
    "看起来也没有统一用 let 那么整齐了。。。"

    笑出声,let 和 const 的设计初衷,就是为了让你的 js 代码“美观”“整齐”的?

    还是补补 let 和 const 的区别吧
    pkoukk
        71
    pkoukk  
       2018-12-20 10:27:33 +08:00
    让我想起了前公司以前有过的不成文的奇葩规定:所有函数中需要用的变量,都在函数开头统一声明,哪怕是临时变量。
    目的就是为了工整。我内心只有一句 MDZZ
    supuwoerc
        72
    supuwoerc  
       2018-12-20 10:29:12 +08:00
    代码优雅不是风格骚气吗 哪是工整啊
    usedname
        73
    usedname  
       2018-12-20 10:46:12 +08:00
    请问楼主是闲的每天写 example 吗?
    kingwl
        74
    kingwl  
       2018-12-20 10:55:55 +08:00
    铜币拿好
    qq1009479218
        75
    qq1009479218  
       2018-12-20 11:31:28 +08:00
    所有变量全用 const,用 fp 写 immutable 代码,那可就特别优雅了
    Sapp
        76
    Sapp  
       2018-12-20 11:33:16 +08:00
    你可以不定义,这样不是更整洁? 仿佛在逗我
    Sapp
        77
    Sapp  
       2018-12-20 11:33:50 +08:00   ❤️ 1
    还有就是 let 最好是一个不用
    rizon
        78
    rizon  
       2018-12-20 11:36:57 +08:00
    我没有试过,但是制表符应该可以对齐的把。。。制表符不就是解决这种对齐问题的吗。。。
    chengxiao
        79
    chengxiao  
       2018-12-20 11:44:23 +08:00
    @mytry const 做 for 循环因子有什么不对的么? 我貌似经常这么干
    nino
        80
    nino  
       2018-12-20 11:49:44 +08:00
    优先用 const,真的需要再赋值的才改 let
    srx1982
        81
    srx1982  
       2018-12-20 11:50:55 +08:00
    你都说“变量”了,那还用 const ?
    Phariel
        82
    Phariel  
       2018-12-20 12:23:39 +08:00
    你能否把计算机编程语言的基础学习一下,变量和常量分不清吗?
    akatquas
        83
    akatquas  
       2018-12-20 12:34:57 +08:00 via iPhone
    行末的左花括号要不要换到下一行首呢
    crystom
        84
    crystom  
       2018-12-20 15:13:40 +08:00
    @akatquas #83 不换,return 会有问题
    alian
        85
    alian  
       2018-12-20 15:39:48 +08:00
    使用 eslint 你就会很清楚了
    wangcansun
        86
    wangcansun  
       2018-12-20 16:04:37 +08:00
    从我的角度看语义不同:

    let 表示后面还会修改
    const 表示后面不会修改了
    murmur
        87
    murmur  
       2018-12-20 16:09:06 +08:00
    highlevel 的都用钦定 let 和 const 是什么东西
    dinjufen
        88
    dinjufen  
       2018-12-20 16:11:22 +08:00
    同意 11 楼
    v2lf
        89
    v2lf  
       2018-12-20 18:49:04 +08:00
    代码优雅 = 看起来美?
    代码优雅 = 简洁 + 良好的可读性 + 最大化发挥语言的性能?
    FrankHB
        90
    FrankHB  
       2018-12-20 18:53:55 +08:00
    @tabris17 然而这是英语渣解。Initialization 跟 assign 从来都是两回事,let 跟 assign 甚至和保证可修改也未必有一腿,不要被 C 的渣语法和 BASIC 的渣语义忽悠了。


    @Phariel 不说哪来一般人都已经分清什么常量什么变量的自信,你就那么确信“常量”“变量”有“计算机编程语言的基础”的固定含义? PL 里所谓的“变量”什么时候有资格和“常量”并列到一块了? Variable 和 immutable 不矛盾都没几个人拎清吧。像 C 这样的语言其实就没“变量”,估计十有八九也没学清楚吧。

    https://github.com/FrankHB/pl-docs/blob/master/zh-CN/variables.md

    说起来,学了 BASIC 就举一反三 ALGOL-like 的(例如喜闻乐见的谭×之流)还见得少了嘛?

    至于 let 这坨嘛……这里还是简(瞎)单(抄)的,认真打算折腾 PL 里的?搜 administrative normal form 有·真·相。
    wayneshen
        91
    wayneshen  
       2018-12-20 21:02:44 +08:00 via Android
    建议看 github 上 airbnb 的代码规范
    S9Yh4wIFsBG7jnE4
        92
    S9Yh4wIFsBG7jnE4  
       2018-12-20 22:20:41 +08:00
    我虽然是做测试的 但是之前公司的前端同事在技术分享的时候 专门说过这个 我记得是 let 和 const 对变量的作用域是不同的
    easonl
        93
    easonl  
       2018-12-20 22:21:37 +08:00
    …… 两者用法不同啊凶弟
    royzxq
        94
    royzxq  
       2018-12-20 22:32:58 +08:00
    you need tslint/eslint.
    hst001
        95
    hst001  
       2018-12-20 22:37:47 +08:00
    如果是 go,会被格式化成这样对齐:
    let a = 1;
    const b = 2;
    reset69
        96
    reset69  
       2018-12-20 23:47:56 +08:00
    up 说的很有道理 楼上菜鸟太多了 let vs const https://jamie.build/const
    quinoa42
        97
    quinoa42  
       2018-12-21 09:26:40 +08:00
    immutable 和 constant 是不一样的……
    daixu
        98
    daixu  
       2018-12-21 09:48:32 +08:00
    royzxq
        99
    royzxq  
       2018-12-21 13:03:46 +08:00
    #96 算了,讲不清的,自己理解就完事儿了, 溜了溜了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   948 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 21:30 · PVG 05:30 · LAX 13:30 · JFK 16:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.