深拷贝
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);
|
深拷贝实现
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 == null) return obj; 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); } let instance = new obj.constructor(); hash.set(obj, instance) for(var key in obj){ if (obj.hasOwnProperty(key)){ instance[key] = deepClone(obj[key], hash); } } return instance; }
var obj = { a: 2, }; obj.b = obj; var cloneObj = deepClone(obj); console.log(cloneObj === obj, cloneObj)
|
-------------本文结束感谢您的阅读-------------