深浅拷贝

200 阅读1分钟

问:什么是浅拷贝,什么是深拷贝?

答:浅拷贝就是对对象的第一层进行复制,如果是简单数据类型直接复制内容,如果是复杂数据类型,只能复制引用地址,操作拷贝了引用地址的浅拷贝数据,会影响原数据;深拷贝就是对对象内容的完整复制,无论嵌套多少层复杂数据类型,拷贝数据与原数据是完全独立的两份数据。

问:实现浅拷贝/深拷贝的方法?

答:

实现浅拷贝:

1.const arr = arr1.slice()

2.const arr = arr1.concat(arr2)

3.const obj = Object.assign({},obj1)

4.const obj = {...obj1}

实现深拷贝:

1.json.parse(json.stringify(obj)) 缺陷:对象内容除了对象/数组格式,其余非字符串的内容也会被转为字符串,比如Date/正则

2.手写递归拷贝

    function deepCopy(obj) {
    
      if (obj === null) return null
      
      if (typeof obj !== 'object') return obj
      // 处理正则表达式
      if (obj instanceof RegExp) return new RegExp(obj);
    // 处理日期对象
      if (obj instanceof Date) return new Date(obj);
  
      const newObj = Array.isArray(obj) ? [] : {}
      
      for (const key in obj) {
      
      newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key]
      }
      return newObj
    }

3.lodash.cloneDeep

//npm i lodash -S
import lodash from 'lodash'
lodash.cloneDeep(obj)