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

2018-03-14 10:01:43 +08:00
 wwjvtwoex
最近把代码中的大多数 var let 变量变成了 const (除了 循环计数器 和 循环枚举值)

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

请问这样作有什么害处吗?
8124 次点击
所在节点    JavaScript
55 条回复
nodekey
2018-03-14 11:47:27 +08:00
effective cpp 条款 03 尽可能使用 const

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

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

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

typescript Readonly<T> 无压力
ke1vin
2018-03-14 14:30:54 +08:00
@SoloCompany 不能对齐怎么解释,var(let)/val 不就和 let/const 设计差不多么
svenzhao
2018-03-14 14:52:41 +08:00
@murmur 对象是引用好的么 它的成员和 const 本身没有关系? 其他语言例如数组 切片的一样可以改变值
IvanLi127
2018-03-14 15:02:02 +08:00
过度?不存在的,只要不会变就应该用 const
wwjvtwoex
2018-03-14 15:08:52 +08:00
@murmur #32 可以用 freeze() 冻结对象
murmur
2018-03-14 15:42:50 +08:00
@svenzhao 对啊 所以我更喜欢那种用全大写标识常量的 至少不需要 IDE 也不需要 es6 光凭直觉就知道他是常量
还是那句话 语言本身只能约束老实人 真正想改的怎么改都有一万种方法
一个弱类型预言非要添油加醋结果最后和 c 不像和 java 也不像
svenzhao
2018-03-14 16:42:49 +08:00
@murmur 但是 js 也是要经过编译 cons let 的存在 理论上从词法分析上面就会快一些 而且也可以在程序预编译阶段暴露出很多不规范的写法.
你不能因为它本来烂就不让它往好的方向发展不然也不会有那么多人推 typescript 了.
现在 js 的项目越来越大 不论 node 还是前端
这种 var 常量某一个层级非常高的类使用了 如果被改变不报错 业务逻辑展示不正常 出现 js 的调用栈 调试成本非常高.
如果真的要冻结对象 freeze 也是可以做到的.
你要随便简单小页面那随便 出问题了 人脑也能 debug 的过来.
BearD01001
2018-03-14 17:06:50 +08:00
感觉 arr.length = 0 要比 arr = [] 要多敲好几个键盘 - -!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/437838

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX