forEach究竟能不能改變數組的值 :https://blog.csdn.net/ZhengKehang/article/details/81281563
初學者每次提到Array對象的時候有些煩人,有些方法是改變原數組的,有些則不改變原數組。 有趣的存在~forEach這個方法,或者說數組存儲的數據本身 看兩個例子: 例子一:
let obj = {'1':1}
let oldArr = ['1',1,obj,true]
oldArr.forEach((el)=>{
el = 1
})
console.log(oldArr)
從例子一來看forEach並不改變原數組 例子二:
let obj = {'1':1}
let oldArr = ['1',1,obj,true]
oldArr.forEach((el)=>{
if(typeof el == 'object'){
el['2']=2
}
el = 2
})
console.log(oldArr)
例子二里的obj的值是被改變了的,那么forEach究竟改不改變原數組呢? 所以我們回到概念,forEach方法只是操作數據而已,數組里的數據是如何引用的呢? js的數據有基本數據類型和引用數據類型,同時引出堆內存和棧內存的概念。對於基本數據類型:Number、String 、Boolean、Null和Undefined,它們在棧內存中直接存儲變量名和值。而Object對象的真實數據存儲在堆內存中,它在棧內存中存儲的是變量名和堆內存的位置。 而在forEach方法里操作了obj對象,實際操作的是對象本身,而數據只是引用了對象的棧內存地址,所以數組里的數據相應改變。 那么為什么forEach方法不能改變數組里的基本變量呢?
let a = 1
let obj = {'1':1}
let oldArr = ['1',1,obj,true,a]
oldArr.forEach((el)=>{
if(typeof el == 'object'){
el['2']=2
}
el = 2
})
a = 2
console.log(oldArr)
不僅forEach方法無法改變,直接在外面操作a變量也無法改變。 因為數組內的基本變量,在棧內存內生成了自己的值,並非引用棧內存的地址。
let a = 1
let obj = {'1':1}
let oldArr = ['1',1,obj,true,a]
oldArr.forEach((el,index)=>{
// if(typeof el == 'object'){
// el['2']=2
// }
oldArr[index] =2
})
console.log(oldArr)
神奇的事發生了,基本數據類型也被改變了。 因為我們使用forEach方法的時候對於每個數據都創建了一個變量el,我們操作的是el變量,對於基本數據類型,el變量就是新創建的一個內存。el變量改變並不影響基本原來地址值的改變。而el變量對應的是引用數據類型時,實際還是一個引用地址,操作它,仍舊操作的是對應的堆內存。
