我刚刚遇到了这个概念
var copy = Object.assign({}, originalObject);
它会将原始对象的副本创建到" copy
"对象中.但是,我的问题是,这种克隆对象的方式是创建深拷贝还是浅拷贝?
PS:令人困惑的是,如果它创建了一个深层副本,那么它将是克隆一个对象的最简单方法.
忘记深拷贝,即使浅拷贝也不安全,如果你要复制的对象有一个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
通过使用Object.assign()
,您实际上正在对您的对象进行浅层复制.每当我们执行一个操作,比如将一个对象分配给其他对象时,我们实际上执行浅层复制,即如果OBJ1是一个对象,则通过另一个OBJ2对象修改它也将反映OBJ1中的更改.
根据MDN的这一段,它创建了一个浅层副本:
对于深度克隆,我们需要使用其他替代方法,因为Object.assign()复制属性值.如果源值是对象的引用,则它仅复制该引用值.
出于redux的目的,Object.assign()
就足够了,因为redux app的状态只包含不可变值(JSON).
对于小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)