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

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

  •  1
     
  •   mytry · 95 天前 · 4961 次点击
    这是一个创建于 95 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    另外代码里很多地方用了 const 下一行再 await,这下反而更对齐了 233333333
        19
    tabris17   95 天前
    我觉得作为一个优雅的英语使用者,应该用 assign a = ...
        20
    ShangbaizeDaoye   95 天前
    @mytry 这样的话,那还是建议多关注易读性和逻辑,过于纠结这种没必要的对齐,到最后可能会事倍功半。。
    大不了也可以像我上面说的 const 放一起,let 放一起。。
        21
    lscho   95 天前 via iPhone
    能用 const 的尽量用 const
        22
    Mutoo   95 天前
    人生苦短,我用 let (可以少打两个字母)
        23
    mytry   95 天前
    见过个最极端的,把 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);
    }
    ```
        24
    Jasonwxy   95 天前
    这有什么好纠结的。。我都是用 const,如果某个变量之后可能要变化,就用 let。我之前也强迫症,一下升级了全部项目依赖。。然后,之后升级依赖都小心翼翼的。。
        25
    autoxbc   95 天前
    统计了一下自己的小项目,const 和 let 的用量是 14:1
        26
    aleung   95 天前   ♥ 1
    代码里尽可能使用 const,而不用 let。

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

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

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

    <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>
        67
    lwlipuyang   94 天前
    你可能是个傻子...
        68
    besto   94 天前
    @Nasei 现在依然有, 并不是个坏习惯. 驱动里往往几十行一起赋值
        69
    YYYeung   94 天前
    能用 const 的地方用了 let, eslint 会骂人的。。。
        70
    frankkai   94 天前
    "本来两个 a 都是工整对齐的"
    "感觉没以前美观了"
    "看起来也没有统一用 let 那么整齐了。。。"

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

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

    let 表示后面还会修改
    const 表示后面不会修改了
        87
    murmur   94 天前
    highlevel 的都用钦定 let 和 const 是什么东西
        88
    dinjufen   94 天前
    同意 11 楼
        89
    v2lf   94 天前
    代码优雅 = 看起来美?
    代码优雅 = 简洁 + 良好的可读性 + 最大化发挥语言的性能?
        90
    FrankHB   94 天前
    @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 有·真·相。
        91
    wayneshen   94 天前 via Android
    建议看 github 上 airbnb 的代码规范
        92
    shayang888   93 天前
    我虽然是做测试的 但是之前公司的前端同事在技术分享的时候 专门说过这个 我记得是 let 和 const 对变量的作用域是不同的
        93
    easonl   93 天前
    …… 两者用法不同啊凶弟
        94
    royzxq   93 天前
    you need tslint/eslint.
        95
    hst001   93 天前
    如果是 go,会被格式化成这样对齐:
    let a = 1;
    const b = 2;
        96
    reset69   93 天前
    up 说的很有道理 楼上菜鸟太多了 let vs const https://jamie.build/const
        97
    quinoa42   93 天前
    immutable 和 constant 是不一样的……
        98
    daixu   93 天前
        99
    royzxq   93 天前
    #96 算了,讲不清的,自己理解就完事儿了, 溜了溜了。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2386 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 30ms · UTC 13:28 · PVG 21:28 · LAX 06:28 · JFK 09:28
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1