这是一个很好的面试题,答案是:可以,在大多数情况下。
const
关键字在 JavaScript 中的作用是创建一个常量引用,而不是创建一个不可变的值。这需要根据 const
声明的是什么类型的值来具体分析:
1. 对于基本数据类型(原始值)
当 const
声明的是字符串、数字、布尔值等基本类型时,其值是不可重新赋值的。
const str = "hello";
str = "world"; // ❌ 报错:TypeError: Assignment to constant variable.
2. 对于引用数据类型(对象、数组)
当 const
声明的是一个对象或数组时,它保证的是变量的引用地址不能改变,但对象内部的属性是可以修改的。
const obj = {
name: "Alice",
age: 25
};
obj.name = "Bob"; // ✅ 允许
obj.age = 30; // ✅ 允许
obj.city = "Beijing"; // ✅ 允许,可以添加新属性
console.log(obj); // { name: "Bob", age: 30, city: "Beijing" }
// 但是,不能重新赋值整个对象:
obj = {}; // ❌ 报错:TypeError: Assignment to constant variable.
如何真正让对象不可变?
如果你希望一个对象完全不可修改,可以使用以下方法:
Object.freeze()
:冻结对象,使其属性不可增删改(浅冻结)。Object.seal()
:密封对象,属性可读写但不可增删。- 使用
immutable.js
等库。 - 在类中使用
#private
字段和只读 getter。
const frozenObj = Object.freeze({
name: "Alice"
});
frozenObj.name = "Bob"; // ⚠️ 严格模式下报错,非严格模式静默失败
console.log(frozenObj.name); // 仍然是 "Alice"
总结
const
阻止的是重新赋值变量,而不是阻止修改变量所指向的对象的内容。因此,const
对象的属性通常是可以修改的,除非对象被进一步冻结或封装。
这也是为什么我们常说:const
创建的是一个不可重新赋值的绑定,而不是一个不可变的对象。
THE END