const与常量
我们知道const用于声明常量,但是当我们用const声明数组和对象时,数组和对象却是可以添加删除属性的。刚开始的时候笔者也比较疑惑,使用const不是声明常量吗,常量的值和属性应该不可修改啊
笔者后来去mdn上查看了相关的说明,原文如下:
“const声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配。例如,在引用内容是对象的情况下,这意味着可以改变对象的内容(例如,其参数)。”
意思就是,使用const声明的变量,并不是保证该变量的值不可变,而是保证该变量指向的内存地址不可变。对于基本数据类型,数据的值就保存在变量指向的那个内存地址,因此使用const声明的简单数据类型即为常量。但是对于引用数据类型,使用const声明变量只能保证该变量指向的地址不变,但是由于引用数据类型的值并不保存在该内存地址中,所以const不能保证引用数据类型的值不变
1 | const obj = {} |
如果要想声明一个属性不可修改的引用数据类型变量,可以用Object.freeze()方法,这里不多展开
何时使用const
最近翻阅《JavaScript权威指南》时,发现关于何时使用const,本书作者有提到两种论调:
第一种论调
只在值基本不会改变的情况下,使用const声明变量,例如物理常数、程序版本号、表示文件类型的字节序之类的数据
第二种论调
应该全部使用const声明变量,然后发现确实需要允许值发生变化,再改成let
理由:该论调认为 1.程序中所谓很多变量实际上在程序运行时并不会改变;2.这样有助于避免因为意外修改变量而导致bug
作者提到他本人在写代码时倾向于第一种思路,只对那些必须不变的值使用const,笔者也同样倾向于该思路