最近在寫(xiě)javaScript代碼時(shí)勺远,有個(gè)問(wèn)題一直困惱著我
var arr1 = [{name: '小明'},{name: '李雷'}, {name: '陳多'}];
//var arr2 = arr1.map((person) => person)
var arr2 = [...arr1]
arr2[0].name = '大明'
console.log(arr1) //1、[ { name: '大明' }, { name: '李雷' }, { name: '陳多' } ]
arr2[1] = {age: 23}
console.log(arr1) //2、[ { name: '大明' }, { name: '李雷' }, { name: '陳多' } ]
console.log(arr2) //3夜惭、[ { name: '大明' }, { age: 23 }, { name: '陳多' } ]
arr2不是通過(guò)'...'或者map函數(shù)重新生成的一個(gè)數(shù)組對(duì)象嗎岖食?為什么改變新數(shù)組中的對(duì)象的屬性莹妒,原始數(shù)組中的對(duì)象的屬性也會(huì)改變呢名船?
通過(guò)畫(huà)堆棧圖,我發(fā)現(xiàn)原因只有一個(gè):我們?cè)趯?duì)數(shù)組使用'...'或者map旨怠、filter來(lái)生成新數(shù)組時(shí)渠驼,雖然js在內(nèi)存中新建了一個(gè)數(shù)組,但是數(shù)組中的元素的地址指向并沒(méi)有變化运吓。
下面是堆棧圖渴邦,有助于理解:
另一種情況是不生成新數(shù)組,直接賦值的方式拘哨,堆棧圖如下:
關(guān)于javaScript值傳遞還是引用傳遞的問(wèn)題可以看這篇文章:
JavaScript值傳遞 or 引用傳遞谋梭?