【前端面试指南】JS-1-手写深拷贝和浅拷贝

  1. 浅拷贝

    1. 定义:浅拷贝是拷贝第一层的拷贝

    2. 方法:

      1. 使用Object.assign解决这个问题。
      let a = {
        age: 1
      }
      let b = Object.assign({}, a)
      a.age = 2
      console.log(b.age) // 1
      
      1. 通过展开运算符 ... 来实现浅拷贝
      let a = {
        age: 1
      }
      let b = {...a};
      a.age = 2;
      console.log(b.age)  // 1
      
  2. 深拷贝

    1. 定义:深拷贝是拷贝所有层的拷贝

    2. 方法

      1. 简单的做法:JSON.parse(JSON.stringfy(obj))
      2. 将一个对象转成json字符串,然后又将字符串转回对象
    3. 缺点

      1. 会忽略undefined
      2. 会忽略symbol
      3. 会忽略函数
      4. 不能解决循环引用的对象 (会报错)
  3. 手写深拷贝

    1. 递归

    2. 判断类型,注意判断 值类型 和 引用类型,判断是 数组 还是 对象

    3. 检查循环引用

    4. 不可能拷贝原型 _proto_

    5. 代码

      function deepClone (obj = {}) {
          if (typeof obj !== 'object' || obj == null) {
              //obj是null,或者不是对象和数组,直接返回
              return obj
          }
          //初始化返回结果
          let result
          if (obj instanceof Array) {
              result = []
          }
          else {
              result = {}
          }
          for (let key in obj) {
              //保证key不是原型的属性
              if (obj.hasOwnProperty(key)) {
                  //递归调用
                  result[key] = deepClone(obj[key])
              }
          }
          imooc
          //返回结果
          return result
      }
      

你可能感兴趣的:(前端面试指南)