美文网首页
手写深拷贝

手写深拷贝

作者: 泡杯感冒灵 | 来源:发表于2020-08-01 09:41 被阅读0次
    
    function deepClone(obj) {
      if (typeof obj !== 'object' || obj === null) {
        return obj
      }
    
      let res 
    
      if (obj instanceof Array) {
        res = []
      } else {
        res = {}
      }
    
      for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
          res[key] = deepClone(obj[key])
        }
      }
    
      return res
    }
    

    注意:Object.assign()不是深拷贝

    语法:Object.assign(target, ...sources)
    作用: 将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

    const target = { a: 1, b: 2 }
    const source = { b: 3, c: 4 }
    
    const returnedTarget = Object.assign(target, source)
    
    console.log(target)  // {a: 1, b: 3, c: 4}
    console.log(returnedTarget)  // {a: 1, b: 3, c: 4}
    
    // 给 returnedTarget 追加一个属性
    const returnedTarget2 = Object.assign(returnedTarget, { d: 5 })
    console.log(returnedTarget2)  // {a: 1, b: 3, c: 4, d: 5}
    

    看似是深拷贝

    const souce = { b: 3, c: 4 }
    const deepSource = Object.assign({}, source)
    console.log(deepSource)  // {b: 3, c: 4}
    source.b = 10
    console.log(deepSource.b)  // 3
    

    但其实是拷贝的source的第一层级(c:4,d:5),如果source还有第二层级(d:{...}),就看出不是深拷贝了

    const source = { b: 3, c: 4, d: {x:5,y:6}}
    
    const deepObj = Object.assign({}, source)
    console.log(deepObj)  
    console.log(deepObj.d.x)  // 5
    source.d.x = 7
    console.log(deepObj.d.x)  // 7
    

    相关文章

      网友评论

          本文标题:手写深拷贝

          本文链接:https://www.haomeiwen.com/subject/fuwrrktx.html