V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
wwjvtwoex
V2EX  ›  JavaScript

const 的过度使用有什么害处吗?

  •  
  •   wwjvtwoex · 2018-03-14 10:01:43 +08:00 · 8070 次点击
    这是一个创建于 2207 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近把代码中的大多数 var let 变量变成了 const (除了 循环计数器 和 循环枚举值)

    对象没有 freeze
    清除数组用 ary.length = 0
    清除对象用 obj.attr = undefined

    请问这样作有什么害处吗?
    55 条回复    2018-03-19 09:30:32 +08:00
    noe132
        1
    noe132  
       2018-03-14 10:03:30 +08:00 via Android
    没有
    zhuangzhuang1988
        2
    zhuangzhuang1988  
       2018-03-14 10:05:40 +08:00
    没有
    MeteorCat
        3
    MeteorCat  
       2018-03-14 10:06:51 +08:00 via Android
    没有
    viko16
        4
    viko16  
       2018-03-14 10:18:36 +08:00   ❤️ 1
    「清除对象用 obj.attr = undefined 」
    永远不要手动赋 undefined,给 null 吧,效果一样的
    crysislinux
        5
    crysislinux  
       2018-03-14 10:23:58 +08:00 via Android
    const 不合适就 let 啊,我不喜欢 arr.length. = 0 这种
    wengjin456123
        6
    wengjin456123  
       2018-03-14 10:25:09 +08:00
    没有
    murmur
        7
    murmur  
       2018-03-14 10:27:19 +08:00   ❤️ 2
    全 let 就可以
    这种东西本来就是约束老实人的
    别说 js 了
    java 里各种反射 c 里各种 cast 还不是一顿魔改访问权限
    我感觉这样更好
    var v1 =xxx ;//谁改这个全家死
    murmur
        8
    murmur  
       2018-03-14 10:29:51 +08:00
    另外我个人感觉 对于 js 这种弱类型 var 起家的语言 用全大写下划线命名的约束力可能都比 const 强
    MinonHeart
        9
    MinonHeart  
       2018-03-14 10:31:04 +08:00

    多两个字符要敲打,增加手指的压力,不利于身心健康
    JamesRuan
        10
    JamesRuan  
       2018-03-14 10:34:28 +08:00   ❤️ 2
    我的代码里基本没有 let,var 一个都没有,99.9%都是 const。
    这个约束对于编译器来说就是个优化提示,一般没什么用处,但对于写代码的来说,是防止随意修改变量的一个防御手段。
    基本不用变量就能防止一大部分 bug 了,(当然如何你没有意识到不用变量的好处,const 对你来说就是没有用的)。
    morethansean
        11
    morethansean  
       2018-03-14 10:41:10 +08:00   ❤️ 1
    除非是真的 const 否则建议都是 let.
    动不动新起一个变量就 const 还得考虑半天我底下到底会不会在处理的过程中改掉他,然后突然发现逻辑一改还是要改一下的拖到上面去把 const 改回 let 真的是太烦人了。
    最讨厌的就是有人说,你的代码里这个变量没有改啊 eslint 都会建议你把这个变量弄成 const 呢。
    wwjvtwoex
        12
    wwjvtwoex  
    OP
       2018-03-14 10:41:46 +08:00
    @murmur #7 js 中可以修改 const 吗 ?

    例如: const answer = 42
    leemove
        13
    leemove  
       2018-03-14 10:46:12 +08:00
    const 挺好的啊,比起标记让别人不要改这个变量,莫不如靠规则来制约.
    mcfog
        14
    mcfog  
       2018-03-14 10:50:33 +08:00
    几乎全 const 路过,要用 let 的时候我会反复怀疑是不是代码该重构了
    DRcoding
        15
    DRcoding  
       2018-03-14 10:57:31 +08:00
    乃们就没有动态的变量嘛,也用 const 嘛,QAQ
    murmur
        16
    murmur  
       2018-03-14 10:59:44 +08:00
    @wwjvtwoex babel 后有可能是可以的
    我记得无论是 let 和 const 最后都要转成 var 执行吧
    murmur
        17
    murmur  
       2018-03-14 11:01:00 +08:00   ❤️ 1
    @DRcoding 这种思维是有的,当年 erlang 不就是靠无变量解决并发问题么 没有变量就不需要锁 没有锁并发自然就上去了
    otakustay
        18
    otakustay  
       2018-03-14 11:02:10 +08:00   ❤️ 1
    用 const 有危害吗 - 几乎没有
    用着 const 但不 immutable 有危害吗 - 危害大了去了
    SoloCompany
        19
    SoloCompany  
       2018-03-14 11:41:48 +08:00   ❤️ 1
    最大的害处就是没法对齐, 而且常量和不可写的变量不是同一个概念, 我记得这应该属于 ECMA2015 的一个设计错误了, 远没有 var / val / let 这种设定合理, 估计因为 const 是 ECMA 的远古保留字所以才混用了吧
    wivwiv
        20
    wivwiv  
       2018-03-14 11:42:11 +08:00   ❤️ 1
    让我们来听听 eslint 怎么说
    nodekey
        21
    nodekey  
       2018-03-14 11:47:27 +08:00   ❤️ 1
    effective cpp 条款 03 尽可能使用 const

    (我知道你们不在讨论 cpp ……
    Mutoo
        22
    Mutoo  
       2018-03-14 11:51:59 +08:00
    多打两个键,手疼。
    codermagefox
        23
    codermagefox  
       2018-03-14 11:53:50 +08:00
    @wwjvtwoex #12 如果我没记错的话,栈里的数据不能改变,堆里的东西可以任意操作。
    brickyang
        24
    brickyang  
       2018-03-14 11:56:02 +08:00 via iPhone
    标题是「过度使用」。过度指超过应有的限度,比如不能用 const 的时候用了而导致报错。

    大量(甚至几乎全部)使用 const 没什么问题,但「过度使用」是有害处的。
    BlockBlockBlock
        25
    BlockBlockBlock  
       2018-03-14 11:56:33 +08:00 via iPhone
    没被 var 坑过说明你们太年轻了

    以及…为什么还会有 const 改回 let 的奇葩需求…
    为什么我写代码的时候几百个变量里面最多也就一两个需要 let 的?而且大概率还是在 foe 循环里,或者是需要夸 try catch 作用域的情况
    ChefIsAwesome
        26
    ChefIsAwesome  
       2018-03-14 12:07:59 +08:00   ❤️ 3
    const 是我最讨厌的 es6 特性之一。约束一个变量不能被重新赋值有毛用。用了 const 很容易让人觉得这个变量是不能改的,跟 immutable 混淆。
    zsx
        27
    zsx  
       2018-03-14 12:58:22 +08:00
    我基本上只有 flag / 循环变量等地方用 let
    xiaojie668329
        28
    xiaojie668329  
       2018-03-14 13:02:39 +08:00 via iPhone
    能用 const 就用 const,反正不要用 var。
    469054193
        29
    469054193  
       2018-03-14 13:25:00 +08:00
    const 基本上是 eslint 规范了
    sniffles
        30
    sniffles  
       2018-03-14 13:43:03 +08:00
    一看到 const,心里就稳得不行
    不像是 let,var 还要往后看是不是还会变
    svenzhao
        31
    svenzhao  
       2018-03-14 14:15:16 +08:00
    @ChefIsAwesome const 声明一个只读的常量。一旦声明,常量的值就不能改变。
    murmur
        32
    murmur  
       2018-03-14 14:19:01 +08:00   ❤️ 1
    @svenzhao const 如果指向一个对象呢
    BlockBlockBlock
        33
    BlockBlockBlock  
       2018-03-14 14:20:39 +08:00
    @murmur

    typescript Readonly<T> 无压力
    ke1vin
        34
    ke1vin  
       2018-03-14 14:30:54 +08:00
    @SoloCompany 不能对齐怎么解释,var(let)/val 不就和 let/const 设计差不多么
    svenzhao
        35
    svenzhao  
       2018-03-14 14:52:41 +08:00
    @murmur 对象是引用好的么 它的成员和 const 本身没有关系? 其他语言例如数组 切片的一样可以改变值
    IvanLi127
        36
    IvanLi127  
       2018-03-14 15:02:02 +08:00 via Android
    过度?不存在的,只要不会变就应该用 const
    wwjvtwoex
        37
    wwjvtwoex  
    OP
       2018-03-14 15:08:52 +08:00
    @murmur #32 可以用 freeze() 冻结对象
    murmur
        38
    murmur  
       2018-03-14 15:42:50 +08:00
    @svenzhao 对啊 所以我更喜欢那种用全大写标识常量的 至少不需要 IDE 也不需要 es6 光凭直觉就知道他是常量
    还是那句话 语言本身只能约束老实人 真正想改的怎么改都有一万种方法
    一个弱类型预言非要添油加醋结果最后和 c 不像和 java 也不像
    svenzhao
        39
    svenzhao  
       2018-03-14 16:42:49 +08:00
    @murmur 但是 js 也是要经过编译 cons let 的存在 理论上从词法分析上面就会快一些 而且也可以在程序预编译阶段暴露出很多不规范的写法.
    你不能因为它本来烂就不让它往好的方向发展不然也不会有那么多人推 typescript 了.
    现在 js 的项目越来越大 不论 node 还是前端
    这种 var 常量某一个层级非常高的类使用了 如果被改变不报错 业务逻辑展示不正常 出现 js 的调用栈 调试成本非常高.
    如果真的要冻结对象 freeze 也是可以做到的.
    你要随便简单小页面那随便 出问题了 人脑也能 debug 的过来.
    BearD01001
        40
    BearD01001  
       2018-03-14 17:06:50 +08:00 via iPhone
    感觉 arr.length = 0 要比 arr = [] 要多敲好几个键盘 - -!
    BearD01001
        41
    BearD01001  
       2018-03-14 17:07:42 +08:00 via iPhone
    优先 const,其次 let,弃用 var。
    zhouyg
        42
    zhouyg  
       2018-03-14 17:13:40 +08:00
    多用 const 属于最佳实践的范畴
    allenx
        43
    allenx  
       2018-03-14 17:28:23 +08:00
    老夫写 cpp,能用 const 就用 const,多打几个字以后调试的时候就知道多方便了,至少 const 的变量就不用管了,const 的函数也不需要过于关心。
    shyling
        44
    shyling  
       2018-03-14 17:43:41 +08:00
    就是打字累了吧,毕竟 const 5 个字符,let var 都是 3 个(
    xierch
        45
    xierch  
       2018-03-14 17:48:03 +08:00
    所以现在有些新语言就是默认 const 的嘛
    DOLLOR
        46
    DOLLOR  
       2018-03-14 17:49:38 +08:00
    尽量用,并且配合预处理工具用。
    ConradG
        47
    ConradG  
       2018-03-14 17:52:52 +08:00
    简单类型建议尽可能用 const
    js 由于没有 const 方法,不建议其他的对象类型使用 const
    MinonHeart
        48
    MinonHeart  
       2018-03-14 18:52:08 +08:00   ❤️ 1
    @DRcoding const d = {var: 0}; d.var = 1; 动态,不失“优雅”
    ---
    var a = [1,2,3];
    var b = a; // 如果想要 a,b 同时保持相同的引用,const 就非常推荐用了
    a = [];
    cccRaim
        49
    cccRaim  
       2018-03-14 19:15:33 +08:00
    清除对象不应该用 delete obj.attr 吗
    smilingsun
        50
    smilingsun  
       2018-03-14 19:51:47 +08:00
    怎么感觉自己不是写 js 的,用 let 有什么坑吗?
    otakustay
        51
    otakustay  
       2018-03-14 21:26:36 +08:00
    @BearD01001 但是 arr.length = 0 少生成一个垃圾,为 GC 争取了幸福
    gnaggnoyil
        52
    gnaggnoyil  
       2018-03-14 23:20:46 +08:00
    @murmur 可是 c 里面确实不能通过 cast 来去除 const 啊,除非你把触发未定义行为也定义为"能"
    DRcoding
        53
    DRcoding  
       2018-03-15 09:15:11 +08:00
    @MinonHeart 握草,还有这种姿势,是万万没有想到啊,受教了感谢,另外总感觉用关键字做对象属性名字怪怪的,js 这奇怪的设定,QAQ
    raighne
        54
    raighne  
       2018-03-15 09:18:04 +08:00
    部分老安卓手机会不支持
    e8c47a0d
        55
    e8c47a0d  
       2018-03-19 09:30:32 +08:00
    唯一的害处是,代码会变得很长
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2798 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:50 · PVG 19:50 · LAX 04:50 · JFK 07:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.