极客视点
极客时间编辑部
极客时间编辑部
113240 人已学习
免费领取
课程目录
已完结/共 3766 讲
2020年09月 (90讲)
时长 05:33
2020年08月 (93讲)
2020年07月 (93讲)
时长 05:51
2020年06月 (90讲)
2020年05月 (93讲)
2020年04月 (90讲)
2020年03月 (92讲)
时长 04:14
2020年02月 (87讲)
2020年01月 (91讲)
时长 00:00
2019年12月 (93讲)
2019年11月 (89讲)
2019年10月 (92讲)
2019年09月 (90讲)
时长 00:00
2019年08月 (91讲)
2019年07月 (92讲)
时长 03:45
2019年06月 (90讲)
2019年05月 (99讲)
2019年04月 (114讲)
2019年03月 (122讲)
2019年02月 (102讲)
2019年01月 (104讲)
2018年12月 (98讲)
2018年11月 (105讲)
时长 01:23
2018年10月 (123讲)
时长 02:06
2018年09月 (119讲)
2018年08月 (123讲)
2018年07月 (124讲)
2018年06月 (119讲)
时长 02:11
2018年05月 (124讲)
时长 03:16
2018年04月 (120讲)
2018年03月 (124讲)
2018年02月 (112讲)
2018年01月 (124讲)
时长 02:30
时长 02:34
2017年12月 (124讲)
时长 03:09
2017年11月 (120讲)
2017年10月 (86讲)
时长 03:18
时长 03:31
时长 04:25
极客视点
15
15
1.0x
00:00/04:15
登录|注册

观点: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
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
18
沉浸
阅读
分享
手机端
快捷键
回顶部