实现深拷贝的方法

作者: 大吉的罐头 | 来源:发表于2021-03-05 13:49 被阅读0次
使用JSON.parse与JSON.stringify实现深拷贝

JSON.parse可以把json字符串转化为对象
JSON.stringify可以把json对象转化为字符串

let obj1={
    name:'daji',
    age:18
}
let str=JSON.stringify(obj1)
let obj2=JSON.parse(str)
obj1.age = 30
console.log(obj2)   //{name:'daji',age:18} age还是18没有改变是深拷贝
封装深拷贝函数

封装针对基本数据类型及数组,对象的深拷贝

//判断数据类型函数
//type of obj/arr 都返回object 无法判断引用数据类型
let CheckType=data=>{ 
    //由于Object.prototype.toString.call(data) 用此方法可以判断是数组还是对象
    //CheckType({})   //[object Object]
    //CheckType([])   //[object Array]
    //因此可以:
    return Object.prototype.toString.call(data).slice(8,-1)  //从下标8开始截取,可以返回Object或者Array
}

//深拷贝函数
let deepClone=target=>{
    let targetType = CheckType(target)  //判断数据类型
    let result   
    if(targetType == 'Object'){
        result={}     //如果是对象返回一个对象类型
    }else if(targetType == 'Array'){
        result=[]     //如果是数组返回一个数组类型
    }else{
        return target   //如果是基本数据类型直接返回原数据
    }
    for(let i in target){     //循环遍历
        let value = target[i]   //取每个属性的值,对象也可以用[]取值,例如let obj={a:1};obj['a']输出1
        let valueType = CheckType(value) //如果传入target是对象,又嵌套了对象,还需要value判断数据类型
        if(valueType === 'Object' || valueType === 'Array'){
            result[i]=deepClone(value)  //递归,如果是对象或数组再进行深拷贝
        }else{
            result=value
        }
    }
    return result  //返回结果
}

测试封装函数,成功

let arr1=[1,2,{age:18}]
let arr2=deepClone(arr1)
arr2.age=30
console.log(arr1);  //arr1中的age还是为18不被改变

相关文章

  • JS 中深拷贝的几种实现方法

    JS 中深拷贝的几种实现方法 1、使用递归的方式实现深拷贝 方法二 2、通过 JSON 对象实现深拷贝 缺点 (1...

  • JS深拷贝的实现方法

    1、使用递归的方式实现深拷贝 2、通过 JSON 对象实现深拷贝 注意:JSON对象实现深拷贝无法实现对对象中方法...

  • Javascript中的深拷贝

    JS 中深拷贝的几种实现方法 1、使用递归的方式实现深拷贝 //使用递归的方式实现数组、对象的深拷贝 functi...

  • 不完全深拷贝要实现完全深拷贝

    需求:默认状态下深拷贝指的是不完全深拷贝, 如要实现完全深拷贝, 则要重写copyWithZone: 方法, 自行...

  • iOS基础知识点(网络摘抄)

    1.父类实现深拷贝时,子类如何实现深拷贝。父类没有实现深拷贝时,子类如何实现深拷贝? 深拷贝同浅拷贝的区别:...

  • 对象深拷贝和浅拷贝

    浅拷贝 深拷贝 深拷贝的递归方法 深拷贝的JSON方法

  • 深拷贝、浅拷贝

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅拷贝...

  • 面试题整理

    父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 深拷贝同浅拷贝的区别:浅拷贝...

  • iOS面试基础一

    #父类实现深拷贝时,子类如何实现深度拷贝.父类没有实现深拷贝时,子类如何实现深度拷贝.# <(1)深拷贝同浅拷贝的...

  • 关于继承

    继承的实现方法 属性拷贝 浅拷贝 深拷贝 原型继承 原型式继承 原型链继承 组合继承(深拷贝+优化后的原型式继承)...

网友评论

    本文标题:实现深拷贝的方法

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