JavaScript浅拷贝后冻结需分两步:先用展开运算符、Object.assign()或Array.from()等创建副本,再用Object.freeze()冻结;该操作仅冻结顶层属性,嵌套对象仍可修改。

在 JavaScript 中,浅拷贝后立即冻结新对象,需要分两步操作:先用浅拷贝方法(如 Object.assign()、展开运算符 {...obj} 或 Array.from())创建副本,再用 Object.freeze() 冻结该副本。
对普通对象做浅拷贝并冻结
使用展开运算符或 Object.assign() 创建新对象,然后调用 Object.freeze():
const frozenCopy = Object.freeze({ ...originalObj });const frozenCopy = Object.freeze(Object.assign({}, originalObj));
注意:这只会冻结顶层属性,嵌套对象仍可被修改(因为是浅拷贝 + 浅冻结)。
对数组做浅拷贝并冻结
数组也是对象,同样适用 Object.freeze(),但需先拷贝:
立即学习“Java免费学习笔记(深入)”;
const frozenArr = Object.freeze([...originalArr]);const frozenArr = Object.freeze(Array.from(originalArr));const frozenArr = Object.freeze(originalArr.slice());
冻结后无法增删元素、修改长度,也不能赋值改变已有索引项(如 frozenArr[0] = 'new' 在严格模式下会报错)。
冻结后验证是否生效
可用 Object.isFrozen() 检查:
console.log(Object.isFrozen(frozenCopy)); // true- 尝试修改属性(如
frozenCopy.prop = 'x')在严格模式下抛错,非严格模式下静默失败。
注意事项和常见误区
冻结是浅层的,不影响嵌套对象的可变性:
const obj = { a: 1, nested: { b: 2 } };const frozen = Object.freeze({ ...obj });frozen.nested.b = 3; // ✅ 仍可修改!
如需深度冻结,需递归调用 Object.freeze()(自行实现或借助库),但要注意循环引用问题。


















