当前位置:  开发笔记 > 编程语言 > 正文

JS:Object.assign()是否创建深拷贝或浅拷贝

如何解决《JS:Object.assign()是否创建深拷贝或浅拷贝》经验,为你挑选了4个好方法。

我刚刚遇到了这个概念

var copy = Object.assign({}, originalObject);

它会将原始对象的副本创建到" copy"对象中.但是,我的问题是,这种克隆对象的方式是创建深拷贝还是浅拷贝?

PS:令人困惑的是,如果它创建了一个深层副本,那么它将是克隆一个对象的最简单方法.



1> Ramanlfc..:

忘记深拷贝,即使浅拷贝也不安全,如果你要复制的对象有一个enumerable属性设置为false的属性.

MDN:

Object.assign()方法仅将可枚举和自己的属性从源对象复制到目标对象

举个例子

var o = {};

Object.defineProperty(o,'x',{enumerable: false,value : 15});

var ob={}; 
Object.assign(ob,o);

console.log(o.x); // 15
console.log(ob.x); // undefined



2> 小智..:

通过使用Object.assign(),您实际上正在对您的对象进行浅层复制.每当我们执行一个操作,比如将一个对象分配给其他对象时,我们实际上执行浅层复制,即如果OBJ1是一个对象,则通过另一个OBJ2对象修改它也将反映OBJ1中的更改​​.


如果它只是一个浅表副本,Redux如何工作?我认为它的重点在于对发送的数据进行深度复制,这样如果在商店外更改数据,它也不会改变商店中的内容.如果它是浅层副本,那么数据将被链接,这会导致数据发生问题,即使没有发送也会改变商店中的内容,对吗?
我在Redux中遇到了同样的问题,最后我去了JSON.parse(JSON.stringify()).如果对象被另一个包变异并产生递归问题,这也会有问题.我正在寻找更好的选择.这个方法仍然是我正在使用的方法.

3> 小智..:

根据MDN的这一段,它创建了一个浅层副本:

对于深度克隆,我们需要使用其他替代方法,因为Object.assign()复制属性值.如果源值是对象的引用,则它仅复制该引用值.

出于redux的目的,Object.assign()就足够了,因为redux app的状态只包含不可变值(JSON).


应用程序的redux状态是否包含引用其他对象的对象..?

4> Marian07..:

对于小Data structures我,我看到JSON.stringify()并且JSON.parse()工作得很好.

// store as JSON
var copyOfWindowLocation = JSON.stringify(window.location)
console.log("JSON structure - copy:", copyOfWindowLocation)
// convert back to Javascript Object
copyOfWindowLocation = JSON.parse(copyOfWindowLocation)
console.log("Javascript structure - copy:", copyOfWindowLocation)

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有