简介
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指向新开辟的内存。
那么对于第二段代码是因为,两块内存中的对象没有改变,他们都指向同一块内存,所以一个改变了,另一个也会改变。
以上。