JS forEach遍歷修改對象的問題

為什么第一次修改有效(當我重新分配對象的屬性時),而第二次修改無效(當我重新分配整個對象時)?

? 最佳回答:

考慮以下示例:

我們創建一個對象并將其分配給變量foo,然后將foo分配給bar。因此,現在foobar都引用了相同的對象,如下圖所示。

let foo = { id: 1, val: "foo" };
let bar = foo;

接下來,讓我們更改對象的val字段,即分配給bar。我們注意到,變量foobar都反映了變化,這是因為這兩個變量引用的是同一個對象。

let foo = {id: 1,val: "foo"};
let bar = foo;
bar.val = "bar";
console.log(foo, bar);

接下來,我們將一個新對象分配給bar。請注意,這不會影響foo引用的對象,bar現在只是引用了另一個對象。

let foo = { id: 1, val: "foo" };
let bar = foo;
bar = { id: 1, val: "bar" };
console.log(foo, bar);

讓我們將其與您問題中的forEach示例聯系起來。因此,在forEach循環的每次迭代中,回調函數中的item參數指向數組中的一個對象,當您從這個item參數更改字段時,它會更改數組中的對象,但當您將item分配給新對象時,它不會對存儲在數組中的對象執行任何操作。

如果要用新對象替換整個對象,可以采取幾種方法,其中兩種方法如下所述:

  1. 查找存儲對象的索引并將其替換為新對象。

const arr = [{ id: 1, value: 1 }, { id: 2, value: 2 }, { id: 3, value: 3 }, { id: 4, value: 4 }, { id: 5, value: 5 }];

const index = arr.findIndex((obj) => obj.id === 3);
if (index !== -1) {
  arr[index] = { id: 6, value: 6 };
}

console.log(arr);

  1. 另一種非常常見的方法是在數組上map,并創建一個新數組,替換一個對象。

const arr = [{ id: 1, value: 1 }, { id: 2, value: 2 }, { id: 3, value: 3 }, { id: 4, value: 4 }, { id: 5, value: 5 }];

const newArr = arr.map((obj) => (obj.id === 3 ? { id: 6, value: 6 } : obj));

console.log(newArr);

主站蜘蛛池模板: 国产一区二区三区播放心情潘金莲| 日本精品夜色视频一区二区| 日本强伦姧人妻一区二区| 国产视频一区在线观看| 国产成人精品视频一区| 亚洲一区精品视频在线| 无码精品一区二区三区在线| 日本精品一区二区三区在线视频一| 久久精品日韩一区国产二区 | 国产一区二区三区亚洲综合| 无码播放一区二区三区| 精品一区二区三区东京热| 天堂Aⅴ无码一区二区三区| 精品在线一区二区| 日韩AV在线不卡一区二区三区| 欧美成人aaa片一区国产精品 | 国产激情一区二区三区在线观看| 亚洲伦理一区二区| 一区二区三区国产精品| 精品三级AV无码一区| 蜜桃视频一区二区三区在线观看| 国产精品区一区二区三在线播放 | 亚洲AV噜噜一区二区三区| 亚洲国产欧美日韩精品一区二区三区 | 中文乱码人妻系列一区二区| 精品一区精品二区制服| 精品人无码一区二区三区| 91精品一区二区| 日本精品无码一区二区三区久久久| 国产精品亚洲午夜一区二区三区| 波多野结衣久久一区二区| 亚洲高清一区二区三区电影| 成人区人妻精品一区二区不卡| 精品一区狼人国产在线| 一区视频在线播放| 亚州日本乱码一区二区三区| 亚洲国产视频一区| 国产亚洲综合一区二区三区 | 国产在线精品一区二区高清不卡| 中文字幕一区精品| 亚洲国产一区二区a毛片|