如何封装深拷贝?
1、使用JSON.parse(JSON.stringify())的方式
 let list = [
    {id: 1, stuName: '小米', class: '一年级一班'},
    {id: 2, stuName: '小果', class: '一年级二班'},
    {id: 3, stuName: '小红', class: '一年级三班'},
]
let newList = JSON.parse(JSON.stringify(list)) 
newList.push({id: 100})
console.log('list:',list)
console.log('newList:',newList)
优点:简单
缺点:不能拷贝方法 => function,故只能满足大概80%的需求

2、封装
 function deepClone(source) {
      const targetObj = source.constructor === Array ? [] : {}
      for (let keys in source) {
          // 判断是否有当前属性
          if (source.hasOwnProperty(keys)) {
              // keys可以存在的几种情况:3种,基础数据类型、对象、数组
              // 引用数据类型
              if (source[keys] && typeof source[keys] === 'object') {
                  // 维护层代码或提示代码(实际运行可删除也可保留)
                  targetObj[keys] = source[keys].constructor === Array ? [] : {}
                  // 递归
                  targetObj[keys] = deepClone(source[keys])
              } else {
                  // 基本数据类型,直接赋值
                  targetObj[keys] = source[keys]
              }
          }
      }
      return targetObj
  }
  //示例
  let testData = {
      aa: 'name',
      obj: {str: '哈哈哈', age: 12},
      arr: [1,2,3,4]
  }
  //调用
  let newTestData = deepClone(testData)
  newTestData.aa = "今朝有酒"
  newTestData.arr.push("今朝醉")
  console.log('testData:', testData)
  console.log('newTestData:', newTestData)

知识点补充:
1、[] 的constructor指向 Array(基类)
{}的的constructor指向 Object
2、代码分三类:运行代码、容错代码、维护层代码(提示代码)
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号