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

IT技术 javascript object deep-copy shallow-copy
2021-02-17 07:04:43

我刚遇到这个概念

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

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

PS:令人困惑的是,如果它创建了一个深拷贝,那么这将是克隆对象的最简单方法。

6个回答

忘记深拷贝,即使是浅拷贝也不安全,如果您正在复制的对象的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
这并不能完全回答问题。相反,它表示如果不可枚举会发生什么。
2021-05-11 07:04:43

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

我在 Redux 中遇到了同样的问题,最后我去了 JSON.parse(JSON.stringify())。如果对象被另一个包改变并产生递归问题,这也会有问题。我正在寻找更好的选择。这种方法仍然是我正在使用的方法。
2021-04-19 07:04:43
如果只做一个浅拷贝,Redux 是如何工作的?我认为它的全部意义在于对分派的数据进行深层复制,这样如果数据在商店外发生更改,也不会更改商店中的内容。如果它是浅拷贝,那么数据将被链接,这会导致即使没有调度,数据也会改变存储中的内容,对吗?
2021-04-26 07:04:43

根据MDN 的这段话,它创建了一个浅拷贝

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

对于 redux 而言,Object.assign()就足够了,因为 redux 应用程序的状态仅包含不可变值 (JSON)。

@VictorZamanian 它绝对可以,因此 Object.assign 可能不是正确的工具,具体取决于数据结构。我发现Immutability-helper对 Redux 状态特别有用。它仅对您更改的内容执行深拷贝,而对其他所有内容使用浅拷贝。
2021-05-11 07:04:43
应用程序的 redux 状态不能包含引用其他对象的对象吗?
2021-05-16 07:04:43

对于小的,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)
您的解决方案对我很有用。在我读到这个简单的字符串化和解析解决方案之前,我一直很沮丧。非常感谢。
2021-04-19 07:04:43
伟大的!我很高兴它对你有帮助
2021-04-21 07:04:43
请小心。JSON.stringify() ... JSON.parse()去除设置为 的对象属性undefined,将Date对象转换为日期字符串,并将正则表达式转换为{}. 它会将原始对象的任何“类型”转换为普通对象。
2021-05-14 07:04:43

其他答案很复杂。
有些人根本不回答这个问题。

下面为我​​工作

// 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));

希望有帮助。