美文网首页
手写深拷贝

手写深拷贝

作者: 泡杯感冒灵 | 来源:发表于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

相关文章

  • 深入JavaScript Day33 - 序列化实现深拷贝的缺点

    一、序列化实现深拷贝的缺点、手写深拷贝 1、借助序列化实现深拷贝,有哪些缺点? ①不能拷贝函数 ②不能拷贝Symb...

  • 手写深拷贝

    什么是深拷贝? 简单理解:b是a的一份拷贝,b中没有对a中对象的引用。另一种理解:b是a的一份拷贝,把b和a各画出...

  • 手写深拷贝

    注意:Object.assign()不是深拷贝 语法:Object.assign(target, ...sourc...

  • 手写深拷贝

    手写深拷贝 深拷贝 深拷贝简单理解就是b是a的一份拷贝,且b中不存在a中对象的引用 深拷贝的实现 1.JSON序列...

  • 手写深拷贝

    1. 简述深拷贝 JavaScript 中有2种变量类型:值类型(基本类型)和引用类型。深拷贝和浅拷贝都是针对引用...

  • 深拷贝(手写)

  • 手写深拷贝

    深拷贝

  • 手写深拷贝

  • 手写深拷贝

    方案1.序列化反序列化 上面的代码b就是a的深拷贝当我们修改b里面的值的时候,a的值不会跟着变化。 1.1.缺点 ...

  • 手写深拷贝

网友评论

      本文标题:手写深拷贝

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