定义 浅复制 创建了一个新对象,但其嵌套对象/数组仍被引用(未被复制)。 深度复制 创建一个新对象,并递归复制所有嵌套对象/数组,因此它们完全独立。 📦浅拷贝示例 const obj = { user: "Ali", settings: { theme: "dark" } };
// Shallow copies const copy1 = { ...obj }; const copy2 = Object.assign({}, obj);
copy1.user = "Sara"; console.log(obj.user); // "Ali" (independent primitive)
copy1.settings.theme = "light"; console.log(obj.settings.theme); // "light" (nested object was shared!) 👉 仅复制顶级属性。嵌套引用仍然指向相同的对象。
📦深层复制示例 使用structuredClone(现代 JS) const obj = { user: "Ali", settings: { theme: "dark" } }; const deepCopy = structuredClone(obj);
deepCopy.settings.theme = "light"; console.log(obj.settings.theme); // "dark" ✅ independent 使用 JSON 技巧(不推荐在所有情况下使用) const deepCopy = JSON.parse(JSON.stringify(obj)); ⚠️ 这因、、、Date函数、循环引用而失败。MapSetundefined
使用库 Lodash: _.cloneDeep(obj) Immer:通过深度克隆处理不可变更新。 🛑 浅拷贝的陷阱 改变嵌套结构会泄露变化: const state = { user: { name: "Ali" } }; const next = { ...state }; next.user.name = "Sara";
console.log(state.user.name); // "Sara" ❌ unexpected mutation 在 React/Redux 中,这可能会导致陈旧的渲染,因为 React 认为状态没有改变(引用相同)。 ✅ 何时使用 浅拷贝适用于以下情况:
对象仅具有原语。 您不需要改变嵌套结构。 性能至关重要,您可以控制物体的形状。 在以下情况下需要深层复制:
您必须确保没有共享引用。 使用框架中的嵌套状态(例如 Redux)。 序列化复杂对象(小心特殊类型)。 🔍 性能考虑 深度复制速度较慢且负担较重,因为它会遍历整个对象树。 浅拷贝很便宜,只需重新分配顶级引用。 ✅ 总结 浅拷贝:仅复制顶级属性;嵌套对象是共享的。 深度复制:递归复制所有内容;没有共享引用。 对于平面/简单对象使用浅拷贝,当需要完全独立时使用深拷贝。 ✨ 经验法则:如果您更改嵌套值并且不希望它影响原始值→则需要深层复制。查看更多www.youjiutian.com