一、概念理解

在 JavaScript 的浅拷贝中,如果一个数据是简单类型,直接复制它的值,如果一个数据是复杂数据类型,复制的是它地址的引用,有时候需要我们去深拷贝一个东西。

实现深拷贝 - 图1

实现深拷贝 - 图2

二、JSON.stringify()

这是最简单的深拷贝,特点是简单,但它有一个限制,它只能拷贝符合 JSON 语法的数据类型,数组、对象等,Date 类型它就无法拷贝。

  1. let obj1 = {a:'1',b:'2'}
  2. let obj2 = JSON.parse(JSON.stringify(obj1))

二、递归算法

要点是

  • 递归
  • 判断类型
  • 检查循环引用
  • 需要忽略原型
  1. function deepClone(target){
  2. if (typeof target ==='object'){
  3. let cloneTarget = Array.isArray(target) ?[]:{}
  4. for (let key in target){
  5. cloneTarget[key] = deepClone(target[key])
  6. }
  7. return cloneTarget
  8. }else{
  9. return target
  10. }
  11. }
  12. const target = {
  13. field1: 1,
  14. field2: undefined,
  15. field3: {
  16. child: 'child'
  17. },
  18. field4: [2, 4, 8]
  19. };
  20. const cloneTarget = deepClone(target)
  21. console.dir(target)
  22. console.dir(cloneTarget)

三、参看博客

「@浪里淘沙的小法师」