观点:JavaScript常量真的不可变吗?
极客时间编辑部
讲述:杜力大小:1.95M时长:04:15
JavaScript 中的常量究竟如何工作,常量就是“在正常执行中无法被程序改变的值”吗?“事实并非如此”。Progress 的内容总监 Brian Rinaldi 发文这样说道,并且做了详细解释,如下为关键内容。
表面上看,这似乎很简单,就是设置一个值,一个无法改变的值。这对于可读性和错误检查会十分有用。但是,并非所有语言都有常量,而且拥有常量的各个语言处理常量的方式也不太一样。
而且,通常在设置常量时,会遇到两个概念,就是基元和不变性。简单来说,不可改变的对象是指一个创建后便无法改变其状态的对象。而 JavaScript 中的基元是指“一个不是对象但没有方法的数据”。
JavaScript ES6(又称 ES2015) 中加入了 const 关键词。之前,通常的约定是使用一个标准的变量,但它必须以全大写命名,如 MY_CONSTANT。但这并没有真正规定一个变量是否能够被更改,它只是对程序员的一个提示,提示他们不要更改该变量。
用 const 声明的 JavaScript 常量可以是全局范围的,也可以是区块范围的。如果常量位于区块内,它们就自动是区块范围的。如果它们没有在区块内,则它们是全局范围的。但是,与用 var 声明的变量不同的是,它们不会成为 window 对象的特性。如果它们在模块中,位于区块外用 const 声明的变量对于该模块而言将是全局范围的。
Const 和 var 另一个区别在于,它们提升 (hoist) 的方式不同。当你用 const 或 let 声明一个变量时,该声明将被提升,但是它的初始化值并不是 undefined,因此如果你尝试在声明前访问它的话,会出现引用错误。
另外,const 声明为一个值创建了一个只读的引用。这并不是说其代表的值是不可改变的,而只是说变量标识符不能被重新指定罢了。
但是,当你将 const 用于 JavaScript 基元类型时,const 的行为与你预想的一致,任何重新指定值的尝试都会导致错误。而当你将 const 用于JavaScript 对象时(包括数列、函数等),这个对象仍然是可以更改的,也就是说,这个对象的特性仍然可以被更改。
那么问题来了,你应该用 const 吗?
回答这个问题有点难,特别是因为 let 拥有同样的区块作用域和提升优势。鼓吹 const 优势的人通常关注于代码的可读性。通过使用 const,你相当于表明了这个特定的变量不应该被更改,并且在某种程度上,你强调了这一点。然而,人们好像经常对此产生误解,这一事实把支持 const 可读性的观点给削弱了,就像本文开头所讲的那样。这的确能够一定程度上防止他人重新指定这个变量的值。
但是,“事实上,许多程序员都承认,这一保护能够避免一些不知情的程序员意外地改变某个 const。然而,有个例外,在现实中很可能发生的情况是,当一个程序员需要更改某个变量但却获得了一个‘const- 抛出’错误时,他可能会将 const 直接修改成 let,然后继续工作”。
所以,如果 const 提供的保护较为有限的话,那么我们可能只需要在乎风格偏好了,特别是在 let 和 const 之间做选择时。但如果你的变量需要代表一个基元值,而且这个基元值并不会改变,那么很显然,使用 const 是个合理的选择。不过请注意,如果该值并非一个基元值,那么从可读性的角度来讲,使用 const 会给人带来更多困惑,而不是帮助。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论