const解构锁定变量绑定而非值内容,禁止重赋值但允许修改对象/数组内部;需object.freeze等实现真正不可变。

const 在解构赋值中锁定的是**变量绑定本身**,不是它所引用的值或对象内容。也就是说,你无法给该变量重新赋值,但若它指向的是可变对象(如数组、普通对象),对象内部的属性或元素仍可修改。
解构时 const 绑定不可重赋值
使用 const 解构声明后,变量名与值的绑定关系被固定,后续不能用 = 赋新值:
const { name, age } = { name: 'Alice', age: 30 };
name = 'Bob'; // ❌ TypeError:Assignment to constant variable
这和直接用 const x = ... 的行为一致——禁止对变量标识符做二次赋值操作。
但对象/数组内容仍可变
如果解构出的是引用类型,其内部结构不受 const 保护:
const { user, list } = {
user: { id: 1 },
list: ['a', 'b']
};
user.id = 2; // ✅ 允许:修改对象属性
list.push('c'); // ✅ 允许:修改数组内容
list = []; // ❌ 不允许:试图替换整个数组引用
关键点在于:const 锁住的是“这个变量存了哪个内存地址”,而不是“那个地址里的东西能不能变”。
想真正冻结数据?需配合 Object.freeze 或其他手段
若希望解构后的对象也不可变,要主动冻结:
const data = { a: 1, b: { c: 2 } };
const { a, b } = Object.freeze(data); // 冻结原始对象
a = 99; // ❌ 报错(但注意:b 本身仍是普通对象,未被深层冻结)
注意:Object.freeze 是浅冻结,嵌套对象仍可变。需要深层冻结时得手动处理或借助库(如 immer 的 freeze)。
常见误区提醒
- const 解构不等于“常量对象”——它只防止变量重绑定
- 解构数组时同理:const [x] = [1]; x = 2; 会报错,但 const arr = [1]; arr[0] = 9; 合法
- 函数参数解构也适用:function fn({ id }) { id = 2; } 在函数体内对形参赋值无效(严格模式下报错)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











