关键字常量并不能使值不可变

在前端开发中,我们经常使用关键字 const 来声明常量,以保证其值不会被修改。然而,这里所说的“常量”并不是指真正的常量,它们仍然是可变的。

为什么常量不是真正的常量?

在 JavaScript 中,使用 const 声明的变量并不是真正意义上的常量。虽然它们的值不能被重新赋值,但是它们所引用的对象或数组是可以进行更改的。例如:

----- --- - --- -- ---
------------
----------------- -- --- -- -- --

在上面的代码片段中,我们使用 const 声明了一个数组 arr,然后向其中添加了一个元素 4。尽管 arr 是使用 const 声明的,但是我们仍然能够向其中添加新的元素。

同样的道理,如果我们使用 const 声明一个对象,我们依然可以修改对象的属性:

----- --- - --- -- -- ---
----- - --
----------------- -- --- -- -- --

如何实现真正的常量

要实现真正意义上的常量,我们需要使用 Object.freeze() 方法来冻结对象或数组:

----- --- - ----------------- -- ----
------------ -- ---------- ------ --- -------- -- ------ -- --- ----------

在这个例子中,我们先使用 Object.freeze() 方法来冻结了数组 arr,然后尝试向其中添加一个元素,结果会抛出一个类型错误。这是因为 Object.freeze() 将数组设置为不可扩展、不可配置且所有属性都是不可写的。

同样的,我们也可以用 Object.freeze() 冻结一个对象:

----- --- - ----------------- -- -- ----
----- - -- -- ---------- ------ ------ -- ---- ---- -------- --- -- ------ -----------

在这个例子中,我们尝试修改一个被冻结的对象 obj 的属性值,结果同样会抛出一个类型错误。

总结

尽管使用关键字 const 声明变量可以保证其值不会被重新赋值,但是它们所引用的对象或数组仍然是可变的。如果需要实现真正意义上的常量,我们需要使用 Object.freeze() 来冻结对象或数组。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/11555