多类型深拷贝

2021-09-15  本文已影响0人  辉色星空下

// 深拷贝:对对象内部进行深拷贝,支持 Array、Date、RegExp、DOM
const deepClone = (obj) => {
// 如果不是对象则退出(可停止递归)
if(typeof obj !== 'object') return;
// 深拷贝初始值:对象/数组
let newObj = (obj instanceof Array) ? [] : {};
// 使用 for-in 循环对象属性(包括原型链上的属性)
for (let key in obj) {
// 只访问对象自身属性
if (obj.hasOwnProperty(key)) {
// 当前属性还未存在于新对象中时
if(!(key in newObj)){
if (obj[key] instanceof Date) {
// 判断日期类型
newObj[key] = new Date(obj[key].getTime());
} else if (obj[key] instanceof RegExp) {
// 判断正则类型
newObj[key] = new RegExp(obj[key]);
} else if ((typeof obj[key] === 'object') && obj[key].nodeType === 1 ) {
// 判断 DOM 元素节点
let domEle = document.getElementsByTagName(obj[key].nodeName)[0];
newObj[key] = domEle.cloneNode(true);
} else {
// 当元素属于对象(排除 Date、RegExp、DOM)类型时递归拷贝
newObj[key] = (typeof obj[key] === 'object') ? deepClone(obj[key]) : obj[key];
}
}
}
}
return newObj;
}

// deepClone 函数测试效果
const objA = {
name: 'aaa',
birthday: new Date(),
pattern: /a/j,
body: document.body,
others: [123,'coding', new Date(), /c/ee,]
};

const objB = deepCopy(objA);
console.log(objA === objB); // false

上一篇下一篇

猜你喜欢

热点阅读