深度克隆

基本类型(值类型)没有指向空间地址,所以基本类型没有深度浅度克隆之说,引用类型才有深度浅度克隆之说

1.引用类型基于json字符进行深度克隆

let obj1 = {name:'fuheng'}
let obj2 = JSON.parse(JSON.stringify(obj1))
console.log(obj1 === obj2);//false
obj2.name='fuyi';
console.log(obj1);//{ name: 'fuheng' }

let arr1=[1,2,3,{name:'fuarr'}]
let arr2 = JSON.parse(JSON.stringify(arr1))
arr2[3].name='fuNewArray';
console.log(arr1[3].name);//fuarr

2.基于Object.prototype.toString.call(obj)判断数据类型,进行递归赋值

//获取传入变量的类型 例如[Object Array] => Array
function getObjClass(obj) {
    let result = Object.prototype.toString.call(obj).slice(8, -1);
    if (result === 'Null') {
        return 'Null';
    } else if (result === 'Undefined') {
        return 'Undefined';
    } else {
        return result;
    }
}

function deepClone(obj) {
    let result, objType = getObjClass(obj);
    if (objType === 'Object') {
        result = {};//如果是对象,定义为对象类型
    } else if (objType === 'Array') {
        result = [];//如果是数组,定义为数组类型
    } else {
        return obj; // 如果是其他数据类型不复制,直接将数据返回
    }
    // 遍历目标 对象/数组
    for (let key in obj) {
        let value = obj[key];
        if (getObjClass(value) === "Object" || getObjClass(value) === 'Array') {
            result[key] = deepClone(value);
        } else {
            result[key] = obj[key];
        }
    }
    return result;
}


let obj3 = {username: 'fuheng',age: 18, sex: {option1: '男', option2: '女'}};
let obj4 = deepClone(obj3);
console.log(obj4 === obj3);//false
obj4.sex.option1 = '不男不女'; // 修改复制后的对象不会影响原对象
console.log(obj4);
console.log(obj3);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值