面试题:const 对象的属性可以修改吗?

这是一个很好的面试题,答案是:可以,在大多数情况下

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
喜欢就支持一下吧
点赞10 分享