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

Shi*_*ora 40 javascript object deep-copy shallow-copy

我刚刚遇到了这个概念

var copy = Object.assign({}, originalObject);
Run Code Online (Sandbox Code Playgroud)

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

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

Ram*_*lfc 34

忘记深拷贝,即使浅拷贝也不安全,如果你要复制的对象有一个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
Run Code Online (Sandbox Code Playgroud)

  • 这并不能完全回答问题。相反,它说明了如果它是不可枚举的将会发生什么。 (8认同)

小智 19

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

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

Bih*_*Kim 9

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

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

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

  • 应用程序的redux状态是否包含引用其他对象的对象..? (6认同)

Man*_*ddy 9

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

下面为我​​工作

// 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));
Run Code Online (Sandbox Code Playgroud)

希望有帮助。


Mar*_*n07 5

对于小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)
Run Code Online (Sandbox Code Playgroud)

  • 请小心。`JSON.stringify() ... JSON.parse()` 删除设置为 `undefined` 的对象属性,将 `Date` 对象转换为日期字符串,并将正则表达式转换为 `{}`。它会将原始对象的任何“类型”转换为普通对象。 (2认同)