深拷贝和浅拷贝的区别:

一、浅拷贝:

浅拷贝只是拷贝一层,更深层次的对象级别的只会拷贝引用,因为对象类型的数值是以堆的形式存储的,而我们拷贝的只是指向那个堆的指针,不是对象类型的变量一般都是以栈的形式存储的,是以键值对的方式存储,例如:id:1  name:andy等等,如果这个变量类型是对象的话,那么栈里面只会存储一个指针,负责指向堆内存(也就是我们真正存放对象里面的数据比如{id:2,name:李四}等等),所以浅拷贝(拷贝对象叫b吧)会将被拷贝对象(叫a)的指针也拷贝下来,这样的话,你只要修改b里面对象类型的值就会影响到原对象a中的值,但是如果变量类型不是一个对象的话,则不会被影响。

常用的浅拷贝方法:

var obj = {

id:1,

....

goods:{

name:123,

....

}

};

var o = {};

①for (var k in obj){

//k是属性名,obj【k】是属性值

o[k] = obj[k];

}

②通过es6语法糖的assign方法:

Object.assign(o,obj);

Object.assign(拷贝对象,被拷贝对象);

二、深拷贝:

深拷贝拷贝多层,每一个级别的数据都会被拷贝

var obj = {

id:1,

....

goods:{

name:123,

....

}

};

var o = {};

①第一种方式:封装一个递归函数来实现:

function deepCopy(newobj,oldobj) {

        for (var k in oldobj) {

        //判断属性值的类型

        //1.然后再获取属性值。

              var item = oldobj[k];

        //2.判断这个值是否是数组

        if (item instanceof Array) {

        newobj[k] = [];

        deepCopy(newobj[k],item)

} else if (item instanceof Object){

//3.判断这个值是不是对象

newobj[k] = {}

deepCopy(newobj[k],item)

}else {

        //4.属于简单类型,直接赋值,其实数组和对象在递归的时候只是确定了类型,最终传值的时候都需要走这一步,也就是说上面的函数只是将类型确定下来了,真正的传值操作还是在第四步进行的,殊途同归最终都会是简单类型的值拷贝。

newobj[k] = item;

}

}

}

注意数组和对象顺序不能更换!因为数组也属于对象!

②第二种方式:

只需要进行下列代码操作直接可以获得深拷贝后的值,平时最常用的了。

var newobj = JSON.parse(JSON.stringify(oldobj))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值