Object.assign如何工作?

时间:2017-02-03 09:51:36

标签: javascript assign

我试图更改数组中的字段。我使用find函数来获取对象,然后使用Object.assign覆盖数组中的值。

然而,在一个案例中它起作用:

Object.assign(item2, {id:3, name: "Do"});

而在另一种情况下,它没有:

item = Object.assign({}, {id:3, name: "Do"});

这两种情况有什么不同?



let arr = [{id:1, name:"John"}, {id:2, name: "Doe"}];
let item = arr.find((x)=> x.id === 2);

//the array is not changed!
item = Object.assign({}, {id:3, name: "Do"});
console.log(arr);

let item2 = arr.find((x)=> x.id === 2);
//the array is changed!
Object.assign(item2,  {id:3, name: "Do"});
console.log(arr);




来源:http://jsbin.com/mametudemo/1/edit?html,js,console

5 个答案:

答案 0 :(得分:1)

在第一种情况下,您创建一个新对象并将其分配给char[]item不会更改,因为您尚未使用对它的引用,例如

arr[1]

使用第二种方法,您可以获取对象并使用给定对象更改属性。

arr[1] = Object.assign({}, { id: 3, name: "Do" });

答案 1 :(得分:1)

以下是发生的事情。您找到item

let item = arr.find((x)=> x.id === 2);

此时item是对应数组元素的引用。当你以后做作业时:

item = Object.assign({}, {id:3, name: "Do"});

你将item(之前它是一个引用)的值覆盖到一个新对象上,该对象不再是对原始数组的引用。因此数组不受影响。

答案 2 :(得分:0)

代码中存在拼写错误/错误导致其无法正常工作。

第一次尝试更改使用的对象item = Object.assign({}, {id:3, name: "Do"});时。请注意{}Object.assign的第一个参数...应该是item



let arr = [{id:1, name:"John"}, {id:2, name: "Doe"}];

let item = arr.find((x)=> x.id === 2);
//the array is not changed!
Object.assign(item, {id:3, name: "Do"});
console.log(arr);

let item2 = arr.find((x)=> x.id === 3);
//the array is changed!
Object.assign(item2,  {id:3, name: "Doa"});
console.log(arr);




答案 3 :(得分:0)

Object.assign的第一个参数是target

这用于附加属性,然后返回相同对象的引用。

因此,在第一种情况下,属性将添加到现有对象item2。但是,如果您将此分配给变量以表示temp并执行temp.id = 10,则此变量也会在item2中更改

为避免这种情况,使用了item = Object.assign({}, {id:3, name: "Do"});。这将复制空白对象中的所有属性并返回其引用。所以基本上你已经复制了对象,而不仅仅是引用。

答案 4 :(得分:0)

你有

let item = arr.find((x)=> x.id === 2);

let item2 = arr.find((x)=> x.id === 2);

在这两种情况下,变量都是同一对象的“引用”,对象包含在数组arr中。这意味着如果你更改其中任何一个,那么更改会反映到其他更改中(即使在数组中),因为它们实际上是指完全相同的对象。

现在,您可以通过两种不同的方式修改这两个变量。在这种情况下

Object.assign(item2, {id:3, name: "Do"});

您正在将新值合并到item2中,因为它是一个引用,所以更改会反映到数组中。

在第二种情况下:

item = Object.assign({}, {id:3, name: "Do"});

您正在合并全新对象中的新值(分配{}的第一个参数),然后用它覆盖变量item。现在item不再是对数组内对象的引用。它是一个新对象,因此不会触及数组中的对象。