const声明的变量绑定不可变,但对象属性可修改;因对象是引用类型,const只阻止重新赋值,不冻结内容;需用Object.freeze等实现真正不可变。

const 声明的对象本身不可重新赋值,但对象内部的属性值可以修改。这是因为 const 保证的是“绑定不变”,即变量名始终指向同一个内存地址,而不是对象内容不可变。
为什么能改属性,却不能重新赋值?
JavaScript 中对象是引用类型。const 阻止的是对变量绑定的重新指向,不是冻结对象内容:
- ✅ 允许:修改 obj.name、添加 obj.age、删除 obj.id
- ❌ 不允许:obj = {}、obj = new Date()、obj = null
常见可操作的属性修改方式
只要对象未被冻结(Object.freeze),以下操作都合法:
- 直接赋值:
obj.name = "Alice" - 新增属性:
obj.email = "a@example.com" - 删除属性:
delete obj.age - 通过索引修改数组元素(若 obj 是数组):
arr[0] = "new item" - 调用方法改变自身:
obj.list.push(1)、arr.pop()
如何真正禁止修改对象内容?
如果需要让对象完全不可变,需配合内置 API:
立即学习“Java免费学习笔记(深入)”;
-
Object.freeze(obj):阻止新增、删除、修改已有属性(浅冻结) -
Object.seal(obj):允许修改已有属性值,但禁止新增/删除 - 深冻结需手动递归或使用第三方库(如 immer 的 produce)
注意:freeze 后再尝试修改属性,在严格模式下会报错,非严格模式下静默失败。
容易混淆的典型错误示例
以下代码看似“改了 const 对象”,实际是创建了新对象并试图重新赋值——这会报错:
- ❌
const user = {name: "Tom"}; user = {name: "Jerry"}; // TypeError - ❌
const arr = [1,2]; arr = [3,4]; // TypeError - ✅
const arr = [1,2]; arr.length = 0; // 清空原数组,合法


















