对Object.assign的拷贝分析

简介

Objct.assign是用来做什么的?

如果给你一个这样的三个对象

var a = {a:'a',b:'ab'}
var b = {b:'b',c:'bc'}
var c = {c:'c',ab:'ab'}

让你把b和c合并到a,你会怎么写?
这时候就可以使用Object.assign,他的作用是将第一个参数作为目标,然后将其他参数合并到目标参数中。

Object.assign(a,b,c)
//a --> {a: "a", b: "b", c: "c", ab: "ab"}

具体细节可以参照ES6-Object.assign

解析

在写redux的时候,为了在reducer中不更改原对象,官方推荐使用这种写法

Object.assign({},state,data)

上面的代码将state对象和data对象合并到了一个新的对象,此时达到了既合并state,又不改变state的目的。

那么由此引发了我的一些想法

var a = {c:{cc:'cc'}}
var b = Object.assjgin({},a)
// b--> {c:{cc:'cc'}}

先下结论:

此时生成的b其实既不是a的浅拷贝(简单的用等号赋值)也不是a的深拷贝,而是介于两者之间——深拷贝了第一级属性,无他。

为什么这么说?
我们对b来做一些更改,看看输出结果

b.c=1;
console.log(a) //{c:{cc:'cc'}}
console.log(b) //{c:1}

重启一下再来第二个实例

b.c.cc=1;
console.log(a) //{c:{cc:1})
console.log(b) //{c:{cc:1})

其实不难发现,对于第一段代码的原因是,我们的b的指针并不是简单的指向a指针所指向的内存,而是新开辟了一块内存,里面存放着a的属性,然后b指向新开辟的内存。
那么对于第二段代码是因为,两块内存中的对象没有改变,他们都指向同一块内存,所以一个改变了,另一个也会改变。

以上。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值