Object.assign与Spread的区别

接触过react的都知道,redux当中reducer对对象合并的时候,有两种写法,Object.assign()... Spread展开符。而我一般都是后者,说实话前者根本没用过。。

今天同事问我Object.assign是浅拷贝还是深拷贝,讲道理我是真不知道。。其实脑子是偏向说深拷贝的,因为之前用Spread的时候是说可以代替Object.assignSpread返回的是个新对象。然后和同事说我也不知道,我去看下,于是就有了下面一幕。

看了下,Object.assign确实是浅拷贝,具体可以看这里
在控制台中试了几个例子,看起来会更直观。

可以看到这里正因为object.assign本身是浅拷贝,所以第一个source参数传的是个空对象,所以拷贝的对象并不是引用,改变了j1,拷贝出来的j2对象仍不变。

但是这里可以看到,如果源对象的属性对应的值还是个对象的时候,就会出现值拷贝,指针还是同一个的问题,改变了g对象,源对象a也受影响了,但是通过JSON.parse(JSON.stringify(a))拷贝出来的对象却不会受影响,所以当你使用Object.assign的时候,要注意这一点。

这里用数组代替对象是因为浏览器还不支持这个es7特性,包括最新的node v8.0也还不支持,我也很无奈。。不过数组对象都是引用类型,用来测试都一样。当元素是基本类型时,和Object.assign也一样,没有问题。

接下来,看一下当源数组的元素还是数组时,看下会不会有问题。很明显,不管怎么玩,Spread展开符永远拿到都是新的对象,不存在值引用。

总结下来就是,没用过的东西确实有必要了解,不应该说不用就不需要知道。不过写redux的兄弟们还是用Spread吧。。

菜鸟学习笔记,如有不对,还希望高手指点。如有造成误解,还希望多多谅解。

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。