以前查 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...