forEach無法改變基礎數據類型的問題

最近在項目中使用到forEach去循環字符串數組,發現無法改變字符串的數據。

var arr = ['11','22']
arr.forEach((el) => {
	el = '333'
})
console.log(arr)   ['11','22']

發現上面的代碼沒有效果。就去各種查閱。其實在項目中用到forEach的時候也不少,但從沒去深入瞭解過它的實現原理。

經過多方查閱,發現其實還是棧與堆內存的問題,字符串是基礎數據,存放在棧中,循環出來的el相當於在棧中新建了一個變量,與原來的數據已經沒有關係了,所以最後是不會生效的,可以更改成如下方法

var arr = ['11','22']
arr.forEach((el,index) => {
	arr[index] = '333'
})
console.log(arr)   ['333','333']

arr是個數組類型,是個複雜數據類型,存放於堆中,除了深度拷貝,其他的=賦值全是指向賦值,意思是在內存中還是隻有一個對象,只是多了一個指針指向它。通過arr[index]指向arr,然後賦值,就可以改變它的值。
或者直接使用for循環,就沒有這種情況了。自我理解,可能還有其他錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章