在前端开发中,我们经常使用关键字 const
来声明常量,以保证其值不会被修改。然而,这里所说的“常量”并不是指真正的常量,它们仍然是可变的。
为什么常量不是真正的常量?
在 JavaScript 中,使用 const
声明的变量并不是真正意义上的常量。虽然它们的值不能被重新赋值,但是它们所引用的对象或数组是可以进行更改的。例如:
const arr = [1, 2, 3]; arr.push(4); console.log(arr); // [1, 2, 3, 4]
在上面的代码片段中,我们使用 const
声明了一个数组 arr
,然后向其中添加了一个元素 4
。尽管 arr
是使用 const
声明的,但是我们仍然能够向其中添加新的元素。
同样的道理,如果我们使用 const
声明一个对象,我们依然可以修改对象的属性:
const obj = {a: 1, b: 2}; obj.a = 3; console.log(obj); // {a: 3, b: 2}
如何实现真正的常量
要实现真正意义上的常量,我们需要使用 Object.freeze()
方法来冻结对象或数组:
const arr = Object.freeze([1, 2, 3]); arr.push(4); // TypeError: Cannot add property 3, object is not extensible
在这个例子中,我们先使用 Object.freeze()
方法来冻结了数组 arr
,然后尝试向其中添加一个元素,结果会抛出一个类型错误。这是因为 Object.freeze()
将数组设置为不可扩展、不可配置且所有属性都是不可写的。
同样的,我们也可以用 Object.freeze()
冻结一个对象:
const obj = Object.freeze({a: 1, b: 2}); obj.a = 3; // TypeError: Cannot assign to read only property 'a' of object '#<Object>'
在这个例子中,我们尝试修改一个被冻结的对象 obj
的属性值,结果同样会抛出一个类型错误。
总结
尽管使用关键字 const
声明变量可以保证其值不会被重新赋值,但是它们所引用的对象或数组仍然是可变的。如果需要实现真正意义上的常量,我们需要使用 Object.freeze()
来冻结对象或数组。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/11555