实现一个较为丰富的深copy功能

286 阅读1分钟

定义

function deepClone(variable,hash = new WeakMap()) {
    let value
    if(hash.has(variable)) return hash.get(variable) //解决对象相互引用的情况
    if(getType(variable) === 'object') {
        value = {}
        // 不考虑key为Symbol类型的情况
        // for(var key in variable) {
        //     value[key] = deepClone(variable[key])
        // }
        Object.getOwnPropertyNames(variable).concat(Object.getOwnPropertySymbols(variable)).forEach(key => {
            value[key] = deepClone(variable[key],hash.set(variable,variable))
        });
        return value
    }
    if(getType(variable) === 'array') {
        value = []
        for(var i = 0, len = variable.length; i < len; i++) {
            value[i] = deepClone(variable[i])
        }
        return value
    }
    return variable
}

function getType(val) {
    return Object.prototype.toString.call(val).split(/\[object\s(.*)]/)[1].toLowerCase()
}

使用

let v1 = { a: 1 }
let v2 = deepClone(v1)
v2.a = 3  
v2.a == v1.a // false