浅拷贝和深拷贝
浅拷贝(Shallow Copy)
只复制第一层属性;如果属性值是对象/数组,复制的是引用地址。
所以修改嵌套对象会互相影响。
const obj1 = {
name: "Alice",
info: { age: 18 },
};
const obj2 = { ...obj1 }; // 或 Object.assign({}, obj1)
obj2.name = "Bob"; // 不影响 obj1.name
obj2.info.age = 20; // 会影响 obj1.info.age(同一引用)
console.log(obj1.name); // Alice
console.log(obj1.info.age); // 20
常见浅拷贝方式:
Object.assign({}, obj)- 展开运算符
{ ...obj } - 数组:
arr.slice()、[...arr]
深拷贝(Deep Copy)
递归复制所有层级,嵌套对象也会创建新引用。
修改副本不会影响原对象。
const obj1 = {
name: "Alice",
info: { age: 18 },
};
const obj2 = structuredClone(obj1); // 推荐(现代环境)
obj2.info.age = 20;
console.log(obj1.info.age); // 18
console.log(obj2.info.age); // 20
常见深拷贝方案对比
structuredClone(obj)(推荐)
- 支持大多数常见类型
- 不支持函数、DOM 节点等
JSON.parse(JSON.stringify(obj))
- 简单,但有缺陷:
- 丢失
undefined、symbol、函数 Date变字符串- 不能处理循环引用
- 丢失
const a = {
d: new Date(),
fn: () => {},
u: undefined,
};
const b = JSON.parse(JSON.stringify(a));
console.log(b); // { d: "..." },fn/u 丢失
一句话
- 浅拷贝:只拷贝第一层,嵌套对象共享引用。
- 深拷贝:所有层级都复制,互不影响。
