你不重视的JS基础 - 深浅拷贝

114 阅读1分钟

深浅拷贝通常是对于引用数据类型进行的(数据类型为:对象(Object)、数组(Array)、函数(Function))

浅拷贝

let obj = {obj: 1, name: 2}
let newObj = obj

随着newObj变化,obj也跟着变频化,这种情况下就需要进行深拷贝,才能保证newObj变化对obj的数值不影响。

深拷贝实现方式

  1. JSON.parse(JSON.stringfy(obj))

  2. nodejs项目中,有一个loadsh模块,可以利用它提供的方法来实现深度clone

    const deepClone = require('loadsh/cloneDeep')
    
  3. array.slice(0)方法实现深拷贝

  4. array.concat(arr)方法实现深拷贝

  5. 构造自定义深拷贝函数(使用函数递归实现深拷贝)

    function deepClone(obj) {
      // 判断传入对象是数组还是对象
      var result = Array.isArray(obj) ? []: {}
      for (var key in obj) {
        // 判断当前key是否存在
        if (obj.hasOwnProperty(key)) {
          // 判断当前key所对应的obj[key]的value值是否还是object类型,如果是,则递归调用deepClone函数且赋值给当前的result[key]
          if (typeof(obj[key] === 'object' && obj[key] !== null)) {
            result[key] = deepClone(obj[key])
          }else {
            result[key] = obj[key]
          }
        }
      }
      return result
    }
    
  6. 使用ES6的数组解构实现深拷贝