关于 assign 的克隆问题与解决办法(深复制与浅复制)

本文探讨了在JavaScript中使用`Object.assign`进行对象复制时遇到的浅复制问题,以及为了解决这个问题提出的四种解决方案:通过JSON转换、使用lodash的深复制、jQuery的extend方法和自定义工具类的比较。文章详细分析了每种方法的优缺点和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

Object.assign

解决:

一、使用 JSON复制

二、loadsh的深复制

三、使用 Jquery中 extend

四、工具类简单比较


Object.assign

关于使用Object.assign复制时,对于引用类型里存放引用类型时,此时里面存放引用类型是浅复制。具体事例看测试:

var obj={a:1,b:{name:"cc"}}

var cloneObj=Object.assign({},obj); 

obj.a=2;

cloneObj.a  //1  对于基本数据类型则是深复制

obj.b.name="wcc";
cloneObj.b.name //wcc 对于引用类型则是浅复制(引用地址)

//数组
var arr=[1,{age:12}]
var cloneArr=Object.assign([],arr);
arr[0]=3;
cloneArr[0] //1
arr[1].age=15;
cloneArr[1].age //15  

解决:

一、使用 JSON复制

var obj={a:1,b:{name:"cc"}}

var cloneObj=JSON.Stringify(obj)
cloneObj=JSON.Parse(cloneObj) 

obj.b===cloneObj.b  //false

 该方法有局限性:

  • 会忽略 undefined
  • 不能序列化函数
  • 不能解决循环引用的对象
let person = {
    age: undefined,
    work: function() {},
    name: 'cc'
}
let p = JSON.parse(JSON.stringify(person))
console.log(p) // {name: "cc"}

二、loadsh的深复制

var objects = [{ 'a': 1 }, { 'b': 2 }];
 
var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);

三、使用 Jquery中 extend

var obj={a:1,b:{name:"cc"}}

var cloneObj=$.extend(true,{},obj);


obj.b===cloneObj.b  //false

四、工具类简单比较

const type=obj=>{
    const toString=Object.prototype.toString;
    const map={
        '[object Array]':'array',
        '[object Object]':'object'
    };
    return map[toString.call(obj)]
}
const deepClone=data=>{
    const t=type(data);
    let o,i,length;
    if(t==='array'){
        //数组类型,新建数组
        o=[];
        for(i=0,length=data.length;i<length;i++){
            o.push(deepClone(data[i]))
        }
        return o;
    }else if(t==='object'){
        //新建对象
        o={};
        for(i in data){
            o[i]=deepClone(data[i])
        }
        return o;
    }else{
        //基本数据类型,直接返回
        return data
    }
}

以上是在项目中碰到的问题,与解决方案...fighting

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值