拷贝

2026-02-17

JavaScript 拷贝笔记

1. 浅拷贝

浅拷贝只复制对象的第一层属性,如果属性是引用类型,拷贝的是引用地址。

1
2
3
4
5
const obj = { a: 1, b: { c: 2 } };
const copy = { ...obj }; // 或 Object.assign({}, obj)

copy.b.c = 3;
console.log(obj.b.c); // 3,浅拷贝无法隔离引用对象
  • 数组浅拷贝
1
2
3
4
const arr = [1, [2, 3]];
const arrCopy = [...arr];
arrCopy[1][0] = 99;
console.log(arr[1][0]); // 99

2. 深拷贝

深拷贝会递归复制对象及其嵌套对象,完全独立。

  • JSON 方法(简单对象)
1
const deepCopy = JSON.parse(JSON.stringify(obj));
  • 手写递归深拷贝(支持循环引用)
1
2
3
4
5
6
7
8
9
10
11
12
function deepClone(obj, map = new WeakMap()) {
if (typeof obj !== 'object' || obj === null) return obj;
if (map.has(obj)) return map.get(obj);
const clone = Array.isArray(obj) ? [] : {};
map.set(obj, clone);
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key], map);
}
}
return clone;
}