??我們需要知道的是array屬于復雜數(shù)據(jù)類型,聲明復雜數(shù)據(jù)類型賦值給變量后,變量是一個指向堆內(nèi)存的地址,也稱為引用類型。
??因此當我們把一個引用類型如‘數(shù)組’,賦值給另一個變量時,實際上是把另一個變量指向了與之相同的地址,當我們改變其中一個時,實際上改變了堆內(nèi)存中的存儲內(nèi)容,相應的所有指向該地址的數(shù)組都發(fā)生了變化:
??常見的復制數(shù)組方法 concat() 和slice()
使用時遇到的問題
//例
let list=[{ name: "lisi", id: 1 }, { name: "wangwu", id: 2 }]
let list1 = list.concat();
list1.map(el => {
if (el.id === 1) {
el.name = 'namename'
}
return el
})
// console.log(list, list1);

image.png
list1是復制的list值,遍歷list1并把id等于1的name值改為‘namename’
可以看到跟想象中的不一樣,復制的數(shù)組和原數(shù)組的name值都發(fā)生了改變,猜想其實數(shù)組本身是一個地址,數(shù)組中存在的object1,object2也都有一個地址,當直接用=賦值時。
// 想象中
既list1 === list list1.object1= list.object1 list1.object2= list.object2
/* list1發(fā)生改變,list也會發(fā)生改變*/
concat方法其實是復制了原數(shù)組內(nèi)object1,object2的地址放到新地址里
// 想象中
既 list1===新地址 list1.object1= list.object1 list1.object2= list.object2
/*
*list1發(fā)生改變并不影響原地址 list1.object1中的元素發(fā)生改變 list.object1值也會改變。
*list1.object1可以重新指向一個地址 例如 list1.object1={} list1.object1.name="zhangsan"并不會影響到
*原數(shù)組。
*/
slice與concat情況一樣
找到的解決方法JSON.parse(JSON.stringify(list))
let list=[{ name: "lisi", id: 1 }, { name: "wangwu", id: 2 }]
let list1 = JSON.parse(JSON.stringify(list));
list1.map(el => {
if (el.id === 1) {
el.name = 'namename'
}
return el
})
// console.log(list, list1);

image.png
//想象中
既 list1===新地址 list1.object1= 新地址 list1.object2=新地址