纠结 JS 变量用 let 还是 const 定义 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
mytry
V2EX    程序员

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

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

    理论上说能用 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  
        1
    竟然纠结这种对齐…让我想到了十几年前的 c 代码里,有一种风格是从 = 号对齐的
    rrfeng
        7
    rrfeng  
       2018-12-19 19:57:27 +08:00 via Android
    @Nasei
    现在有时候也会写这样的代码啊…哈哈哈哈哈
    asLw0P981N0M0TCC
        8
    asLw0P981N0M0TCC  
       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 定义的变量之后没有重新赋值就会报错。
    icanfork
        40
    icanfork  
       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 定义可变值的常量的目的,在语法上是允许的。然而你真得能这样用吗?
    dfourc
        54
    dfourc  
       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     Solana     2651 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 13:57 PVG 21:57 LAX 06:57 JFK 09:57
    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