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

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

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

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

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

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

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

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

    大量(甚至几乎全部)使用 const 没什么问题,但「过度使用」是有害处的。
        25
    BlockBlockBlock   188 天前 via iPhone
    没被 var 坑过说明你们太年轻了

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

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