最近在項目中使用到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循環,就沒有這種情況了。自我理解,可能還有其他錯誤。