js 浅拷贝直接赋值_js的浅拷贝和深拷贝的简单理解和使用方法

使用js对象赋值给另一个变量的时候默认是传的引用,什么是引用呢,通俗一点讲就是传的是一个指针,当你对被赋值的变量进行操作的时候原来的值也会变动.这个时候就需要深拷贝啦,也就是把对象所有属性都复制一份到一个新的对象中再赋值

下面是一个浅拷贝的示例var a = {

name: 'name1'

};

var b = {

name: 'name2',

obj: {

e: '1',

f: '2'

}

};

function _quanCopy(d) {

var c = {};

for (var i in d) {

c[i] = d[i];

}

return c;

}

执行下面代码后输出var copyb=_quanCopy(b);

copyb.obj='data is mod';

console.log(copyb);

console.log(b);

拷贝b对象然后把其中的一个属性obj 重新设置成字符串 ,注意obj原来是对 Object 类型数据,输出后没有问题,copyb是一个新的数据更改后对原来的b也不会有任何影响

f6e7eedbfff17a51f7f2fb8540aafad4.png

然后再看下面代码var copyb=_quanCopy(b);

copyb.obj.e='data is mod';

console.log(copyb);

console.log(b);

代码跟上面一样,唯一不同的是没有直接对 obj这个属性进行重写成字符串而是对它里面的属性进行重新赋值,结果却发现,原来的数据b也被改变啦

2afeb090bb477282556229128b39f038.png

上面就是浅拷贝的情况,对于一般的字符串数值类型的数据浅拷贝没有问题,但是对一些数组和对象类数据简单的赋值后只是传啦一个指针,包括函数值参数的时候也是这种情况,对象和数组传的是指针

下面是一个深拷贝的示例//对象深拷贝

var _deepCopy = function(source) {

var result = {};

for (var key in source) {

result[key] = typeof source[key] === 'object' ? _deepCopy(source[key]) : source[key];

}

return result;

}

同样的测试代码,使用深拷贝var copyb=_deepCopy(b);

copyb.obj.e='data is mod';

console.log(copyb);

console.log(b);

cfb5539db2e8099345b8a9a4515b59a7.png

两个新的对象,对对象的修改也各自独立,实现最终目的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值