forEach和map返回新陣列問題

2021-10-19 23:37:42 字數 1802 閱讀 4691

以前查 foreach 和 map 的區別時, 總能看到這樣一句話:

foreach() 方法不會返回執行結果, 而是 undefined. 也就是說,foreach() 會修改原來的陣列. 而 map() 方法會得到乙個新的陣列並返回.

我的理解就是使用 foreach 遍歷乙個陣列, 修改 item 的值, 就會改變原陣列, 但最近發現並不一定會改變, 所以就做了一些測試

測試一:

可以看到這樣是可以修改原陣列的值的

那試試 map 吧

咦? arr 這個原陣列的值為什麼也改變了呢?

在網上搜了一下, 原來是上面的 map 方法不夠 「純粹」, 實際上還是直接修改了每個 item 的屬性, 要想不影響原有物件, 應該這麼寫:

測試二上面的測試都是修改原陣列中某乙個物件的某乙個屬性, 那如果直接修改陣列的某乙個物件呢?

發現原陣列並沒有改變

那 map 呢?

發現原陣列也沒有改變原理

不論是 foreach 還是 map,所傳入的 item 都是原陣列所對應的物件的位址值,

當你修改 item 某乙個屬性後, 指向這個 item 對應的位址值的所有物件都會改變,就會出現測試一的結果;

但如果你直接將 item重新賦值,那 item 就和原陣列所對應的物件沒有關係了, 不論你如何修改 item, 都不會影響原陣列了

上面所說的都是陣列中的每個值都是物件的情況, 也可以試試值不是物件的陣列, 比如基本型別,那這樣是無論如何也不會修改原陣列了, 因為基本型別並沒有位址值這一說, 只是將值賦給 item, 他們之間並沒有關聯關係擴充套件

可以這樣理解,你在做賦值操作時,賦予的是指向到該值的指標。你在foreach乙個物件陣列後修改物件的值觀察到原始陣列的值也跟著變了,是因為陣列指向的物件沒有變,你只是修改了該物件

那為什麼陣列成員是基本型別如字串時,修改字串原始陣列值不會變呢?

那是因為字串是在堆上建立的常量,你修改了字串,堆上會建立乙個新的位址,並將陣列成員的指標指向該位址。所以原始物件的值是不會有變化的。

map修改物件陣列的原理也一樣

稍有修改,取其精髓。

map 和forEach 的區別

對陣列進行迴圈,相當於直接for迴圈,沒有返回值,不能對它進行加工,只是單純的迴圈顯示return無效 item值,index索引,arr該陣列 一般沒用 arr.foreach item,index,arr 對陣列的每一項進行加工,加工完成之後返回乙個新的陣列 注意 map 不會對空陣列進行檢測。...

map和forEach的區別

map 返回其原始陣列的新陣列,但是 foreach 卻沒有。但是它們都確保了原始物件的不變性。1,2,3 map d d 1 2,3,4 1 2,3 foreach d d 1 undefined 如果更改陣列內的值,foreach 不能確保陣列的不變性。這個方法只有在你不接觸裡面的任何值時,才能...

forEach和map的區別

foreach var arr 0 2,4 6,8 var newarr arr.foreach function item,index,arr console.log arr 0,2,4,6,8 arr index item 2 1.對資料的操作會改變原陣列 console.log arr 0,1...