記一次數(shù)組復制遇到的問題

??我們需要知道的是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=新地址 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容