0%

JavaScript-深拷贝浅析

深拷贝

1
JSON.parse(JSON.stringify(object))

该方法有以下几个问题:

  • 会忽略 undefined
  • 会忽略 symbol
  • 不能序列化函数
  • 不能解决循环引用的对象
  • 不能正确处理new Date()
  • 不能处理正则
1
2
3
4
5
6
7
8
9
10
11
let obj = {
name: '111',
a: undefined,
b: Symbol('111'),
c: function() {}
}
console.log(obj);

let b = JSON.parse(JSON.stringify(obj));
console.log(b);
// {name: "111"}

深拷贝实现

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
function deepClone(obj,hash = new WeakMap()){
//避免引用循环 比较对象与对象属性是否相等
// if (obj === parent) return parent;
//处理null undefined
if (obj == null) return obj;
//处理string boolean number
if (typeof obj !== 'object') return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
if(hash.has(obj)){
return hash.get(obj);
}
//处理 array object
let instance = new obj.constructor();
hash.set(obj, instance)
for(var key in obj){
//递归实现深拷贝
if (obj.hasOwnProperty(key)){
instance[key] = deepClone(obj[key], hash);
// instance[key] = deepClone(obj[key], obj);
}
}
return instance;
}

var obj = {
a: 2,
};
obj.b = obj;
var cloneObj = deepClone(obj);
console.log(cloneObj === obj, cloneObj)
-------------本文结束感谢您的阅读-------------