平时开发的时候如果要拷贝一个对象用 JSON 能满足基本要求,但是复杂对象的拷贝 JSON 就满足不了了,譬如对象属性中有日期、函数、正则等,这时我们就要借助第三方库,或者,自己写一个。
乞丐版代码
var obj = {name: 'varlet'}
var cloneOjb = JSON.parse(JSON.stringify(obj))
高配版代码
const deepClone = function (obj, hash = new WeakMap()) {
//处理循环引用
if (hash.has(obj)) return obj;
//定义通过构造函数初始化的类型
const SPECIAL_TYPE = [Date, RegExp, Set, WeakSet, Map, WeakMap];
//通过 obj 的原型创建对象
const cloneObj = Object.create(Object.getPrototypeOf(obj),
Object.getOwnPropertyDescriptors(obj));
hash.set(obj, cloneObj);
for (let key of Reflect.ownKeys(obj)) {
const val = obj[key];
if (SPECIAL_TYPE.includes(val.constructor)) { //特殊类型通过构造函数实例化
cloneObj[key] = new val.constructor(val)
} else if (typeof val === 'object' && val !== null) { //值为对象则递归深拷贝
cloneObj[key] = deepClone(val, hash)
} else { //简单对象直接赋值
cloneObj[key] = val
}
}
return cloneObj;
}
如有错误欢迎指出,欢迎一起讨论!