我刚遇到这个概念
var copy = Object.assign({}, originalObject);
它将原始对象的副本创建到“ copy
”对象中。但是,我的问题是,这种克隆对象的方式是创建深拷贝还是浅拷贝?
PS:令人困惑的是,如果它创建了一个深拷贝,那么这将是克隆对象的最简单方法。
我刚遇到这个概念
var copy = Object.assign({}, originalObject);
它将原始对象的副本创建到“ copy
”对象中。但是,我的问题是,这种克隆对象的方式是创建深拷贝还是浅拷贝?
PS:令人困惑的是,如果它创建了一个深拷贝,那么这将是克隆对象的最简单方法。
忘记深拷贝,即使是浅拷贝也不安全,如果您正在复制的对象的enumerable
属性设置为 false。
目录:
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 应用程序的状态仅包含不可变值 (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)
其他答案很复杂。
有些人根本不回答这个问题。
下面为我工作
// orignal object with deep keys
var originalObject = {
k1: "v1",
k2: "v2",
deepObj: {
k3: "v3",
k4: "v4"
}
};
// make copies now
var copy1 = JSON.parse(JSON.stringify(originalObject));
var copy2 = JSON.parse(JSON.stringify(originalObject));
希望有帮助。