深度复制对象的属性---Js深拷贝

2019-11-18  本文已影响0人  蜻蜓路过风

完整实现方法1

Es6新增的Symbol由于不是引用类型,只有深拷贝
WeakMap和WeakSet由于无法遍历,无法深拷贝

function extend(parent, children) {
    var i,
        toStrF = Object.prototype.toString,
        strC = "[Object Array]"
    children = children || {}
    for (i in parent) {
        if (parent.hasOwnProperty(i)) {
            if (typeof parent[i] === "object") {
                if(parent[i] instanceof Set) {
                    children[i] = new Set([...parent[i]])
                } else if(parent[i] instanceof Map) {
                    children[i] = new Map([...parent[i]])
                } else {
                    children[i] = (toStrF.call(parent[i]) === strC) ? [] : {};
                    extend(parent[i], children[i])
                }
            } else {
                children[i] = parent[i]
            }
        }
    }
    return children
}

实现方法2

利用JSON.parse(JSON.stringify())做属性拷贝,但是需注意此方法会丢失如时间对象,正则对象等

function extend(parent, children) {
    children = children || {}
    for( i in parent) {
        if(parent.hasOwnProperty(i)) {
            children[i] = parent[i]
        }
    }
    children = JSON.parse(JSON.stringify(children))
    return children
}

实现方法3

如果需要复制的对象属性中没有引用类型时,可直接用...

let a = {...b}
上一篇 下一篇

猜你喜欢

热点阅读