js学习笔记-实现一个深拷贝

157 阅读1分钟
// 实现一个拷贝 实现一个递归拷贝

function deepClone(obj) {
    if(obj == null) return obj //如果是null或者undefined 就不进行拷贝操作
    if(obj instanceof Date) return new Date(obj)
    if(obj instanceof RegExp) return new RegExp(obj)
    // 可能是对象 或者 普通的值 如果是函数的话 是不需要深拷贝
    if(typeof obj !== 'object') return obj
    // 是对象的话就要进行深拷贝
    // [] {} Object.protoType.toString.call(obj) == [object Array]?[]:{}
    let cloneObj = new obj.constructor
    for(let key in obj) {
        if(obj.hasOwnProperty(key)) {
            // 实现一个递归拷贝
            cloneObj[key] = deepClone(obj[key])
        }
    }
    return cloneObj
}

// weakMap改进版
function deepClone(obj, hash = new WeakMap()) {
    if(obj == null) return obj //如果是null或者undefined 就不进行拷贝操作
    if(obj instanceof Date) return new Date(obj)
    if(obj instanceof RegExp) return new RegExp(obj)
    // 可能是对象 或者 普通的值 如果是函数的话 是不需要深拷贝
    if(typeof obj !== 'object') return obj
    // 是对象的话就要进行深拷贝
    if(hash.get(obj)) return hash.get(obj)
    // [] {} Object.protoType.toString.call(obj) == [object Array]?[]:{}
    let cloneObj = new obj.constructor
    hash.set(obj,cloneObj)
    for(let key in obj) {
        if(obj.hasOwnProperty(key)) {
            // 实现一个递归拷贝
            cloneObj[key] = deepClone(obj[key], hash)
        }
    }
    return cloneObj
}

let obj = {name: 1, addr: {x:100}}
let o = deepClone(obj)
obj.addr = {x:200}
console.log(o)

欢迎访问小程序:女友睡前故事~