JavaScript技巧之对象拷贝

首先明确三个概念
1. 对象引用

var a = {name:'wanger'}
var b = a ;
a===b // true,两者指向的地址相同
b.name = 'zhangsan'
a.name //变成与b一样的'zhangan'

上述代码中,使用了=进行赋值,于是b指向了a所指向的栈的对象,也就是a与b指向了同一个栈对象,所以在对b.name赋值时,a.name也发生了变化。为了避免上面的情况,可以对对象进行拷贝,代码如下:

2. 拷贝地址(浅层拷贝)–目前使用的方法

var a = {name:'wanger'}
var b = Object.assign({}, a)
a===b // false,两者指向的地址不同
b.name = 'zhangsan'
a.name //依然还是'wanger'

上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆,这时候a与b指向的是不同的栈对象,这样对b的赋值就不会影响到a
问题:
但是如果a.name是一个对象的引用,而不是一个字符串,那么上面的代码也会遇到一些问题

var a = {name:{firstName:'wang',lastName:'er'}}
var b = Object.assign({}, a)
a===b // false,b指向的地址与a不同
b.name.firstName = 'zhang'
a.name.firstName //'zhang',但是b.name与a.name指向的地址确实相同的

b.name.firstName又影响到了a.name.firstName,这是因为Object.assign()方法只是浅层拷贝,a.name是一个栈对象的引用,赋值给b时,b.name也同样是这个栈对象的引用,很多时候,我们不想让这种事情发生,所以我们就需要用到对象的深拷贝。
3. 深层拷贝
由于笔者目前水平有限,无法给出具体的分析,所以详细请见
JS对象进行深度拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值