浅拷贝和深拷贝

143 阅读1分钟

浅拷贝(shallow clone)

特征:只拷贝对象的一层的数据。

注意:浅拷贝需要拷贝对象第一层的数据,而不是赋值操作。

  • 浅拷贝实现的三种方式

    1. Object.assign()
    2. 使用es6提供的拓展运算符 const newObj = {...oldObj}
    3. Array.prototype.slice()。slice() 方法返回一个新的数组对象,这一对象是一个由 begin和 end(不包括end)决定的原数组的浅拷贝。原始数组不会被改变。

深拷贝(deep clone)

特征:拷贝对象所有层的数据。拷贝的数据不会影响原数据。

  • 深拷贝实现的方式

    递归

   function kaobei (newObj, obj) {
        // 遍历
        for (let key in obj) {
          if (obj[key] instanceof Array) {
            // obj[key] 是数组
            // obj[key]是数组
            newObj[key] = []

            kaobei(newObj[key], obj[key])
          } else if (obj[key] instanceof Object) {
            // obj[key] 是对象
            // obj[key]再遍历拷贝
            newObj[key] = {}

            kaobei(newObj[key], obj[key])
          } else {
            newObj[key] = obj[key]
          }
        }
      }

如果原对象存在循环引用,则上述代码会有问题。

解决思路:如果当前要处理的是一个对象,就先去检查这个对象是否已经处理过了。

和朋友一切探讨的,转载自博主-- clp66