自行封装一个深拷贝的函数

HaoOuBa
2021-02-20 / 2 评论 / 282 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年02月20日,已超过1163天没有更新,若内容或图片失效,请留言反馈。
在实际项目中,经常使用到深拷贝,索性封装成一个函数
function deepCopy(obj) {
    // 1、为了兼容数组和对象,所以写一个兼容性赋值
    let newObj = Array.isArray(obj) ? [] : {}
    // 2、接下来进行循环传进来的对象 (for...in...也会循环原型链上的内容)
    for(let key in obj) {
        // 3、因为for...in会循环原型链上的内容,而我们深拷贝的新对象无需原型链上的内容,因此加一层原型链判断
        if(obj.hasOwnProperty(key)) { // 判断是非原型上的数据
            // 4、接着判断是复杂数据类型,还是基本数据类型,如果是基本数据类型,直接赋值就行
            if(typeof(obj[key]) !== 'object') {
                // 基本数据类型
                newObj[key] = obj[key]
            } else {
                // 复杂数据类型,递归再次进行判断
                newObj[key] = deepCopy(obj[key])
            }
        }
    }
    return newObj
}

// 接着验证上面函数
let obj = {
    name: 'lis',
    fn: () => {
        console.log(1)
    },
    child: {
        age: 1,
        son: []    
    }
}
let newObj = deepCopy(obj)
console.log(newObj)
8

评论 (2)

取消
  1. 头像
    PluginsKers
    Android · Google Chrome

    拿走了表情

    回复
  2. 头像
    CBD gummies for pain
    Windows 10 · UC Browser

    Keep on working, great job!

    回复