美文网首页
多类型深拷贝

多类型深拷贝

作者: 辉色星空下 | 来源:发表于2021-09-15 15:06 被阅读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

    相关文章

      网友评论

          本文标题:多类型深拷贝

          本文链接:https://www.haomeiwen.com/subject/sonkgltx.html