手写深拷贝

深拷贝

错误答案 1

使用 JSON.stringifyJSON.parse

  • 无法转换函数
  • 无法转换 Map Set
  • 无法转换循环引用

PS:其实普通对象使用 JSON API 的运算速度很快,但功能不全

错误答案 2

使用 Object.assign —— 这根本就不是深拷贝,是浅拷贝 !!!

  • Object.assign(obj1, {...})
  • const obj2 = Object.assign({}, obj1, {...})
  • 可以理解为,浅层生拷贝,第二层开始都是浅拷贝了

错误答案 3

只考虑了普通的对象和数组

  • 无法转换 Map Set
  • 无法转换循环引用

正确答案

深拷贝

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 深拷贝
function deepClone(obj = {}) {
if (typeof obj !== "object" || obj == null) {
// 不是对象或者数组形式,或是 null ,直接返回
return obj;
}

// 初始化返回结果
let result;
if (obj instanceof Array) {
result = [];
} else {
result = {};
}

// 变量
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
// 保证不是原型属性(原型和原型链部分会讲解)

// 递归调用
result[key] = deepClone(obj[key]);
}
}

// 返回结果
return result;
}

const obj1 = { x: 100, y: 200 };
const obj2 = deepClone(obj1);
obj1.x = 101;
console.log(obj2); // x: 100

手写深拷贝
http://example.com/2023/06/02/手写深拷贝/
作者
shoukailiang
发布于
2023年6月2日
许可协议