js简单深拷贝

2021-11-18  本文已影响0人  唯恶唯玩

思路:1递归子元素,子元素传入函数,基本数据类型不用递归直接返回,{}和[]需要遍历

 const data = [[[{ a: 'b' }]],  { a:[1,2,null,undefined,/a/] ,b(){} ,c:'111'}  ]

  function myTypeofArrayOrObject(tt) {//判断数据是否为{}和[]
    let flagBoolean = (Object.prototype.toString.call(tt) === '[object Object]' || 
                        Object.prototype.toString.call(tt) === '[object Array]')
    return flagBoolean
  }
  function myClone(oldData) {
    let newData;
    if (myTypeofArrayOrObject(oldData)) {
      newData = Array.isArray(oldData) ? [] : {}
      for (let i in oldData) {
        newData[i]=myClone(oldData[i])
      }
    } else {
      newData = oldData
    }
    return newData
  }
  let newData=myClone(data)
  data[0][0][0].a=1;//改值
  data[1].a[0]='aaaa'
  console.log(data ,newData)

效果


screenshot_20211118_155121.jpg
缺点:  1.for...in 性能不好
        2.引用变量不行。
        const arr=['单身狗'];
        var str= '鹅';
        const data = [[[{ a: 'b' }]],{a:[1,2,null,undefined,/a/],b(){},c:'111'},arr,str]
        let newData=myClone(data)
        arr[3]='老王';
        arr.push('猫');  
        str='村霸';
      console.log(data ,newData)
        就很迷,引用数据类型的子元素改动一个变一个不变,这个好理解
    变量两边都改不动,就很迷,估计数组引用变量和变量复制变量一样。
        3.菜鸡一个,不知道还有问题没,也不知道错了没,欢迎批评
screenshot_20211118_163719.jpg
上一篇下一篇

猜你喜欢

热点阅读