js-深拷贝&&浅拷贝

2021-11-04  本文已影响0人  hszz

https://www.cnblogs.com/echolun/p/7889848.html
https://www.jianshu.com/p/cf1e9d7e94fb

简介

  1. 简单的来说,有个对象a, b复制了a, 修改b会影响到a就是浅拷贝,不会影响则是深拷贝
  2. js中有基本数据类型引用数据类型; 他们涉及到堆栈内存
    基本数据类型的键值都在,复制时会开辟新的空间;
    引用数据数据类型的键在中,值在里面,但是栈内存会提供一个引用的地址指向堆内存中的值;b = a 拷贝时只复制到中的地址,而非中的值,所以都指向中的同一个值

递归实现深拷贝

// 递归实现深拷贝
// 非最佳实现
function deepCopy(obj) {
  // 原对象是数组则先初始化为数组,否则初始化为对象
  let objCopy = Array.isArray(obj) ? [] : {};

  // 判断obj是否为引用数据类型
  if (obj && typeof obj === "object") {

    for (key in obj) {

      let prop = obj[key];
      if (prop == obj) {
        //避免相互引用造成死循环,如obj.a=obj
        continue;
      }

      // 判断obj是否有指定的键或者属性
      if (obj.hasOwnProperty(key)) {
          
        // 判断obj子元素是否为引用数据类型,是则递归赋值
        if (obj[key] && typeof obj[key] === "object") {
          objCopy[key] = deepCopy(obj[key]);
        } else {
        // 否则简单复制
          objCopy[key] = obj[key];
        }
      }
    }
  }
  return objCopy;
}

let a = [1, 2, 3, [4, 5]];
let b = deepCopy(a);
b[3][0] = 1;
console.log("a", a);
console.log("b", b);
image.png

使用JSON.stringify和JSON.parse实现深拷贝

JSON.stringify&&parse

// 使用JSON.stringify和JSON.parse实现深拷贝
function deepCopy(obj) {
    let _obj = JSON.stringify(obj)
    let objCopy = JSON.parse(_obj)
    return objCopy
}

let a = [1, 2, 3, 4, [5, 6]];
let b = deepCopy(a);
b[4][0] = 1;
console.log("a", a);
console.log("b", b);
image.png

使用lodash_.cloneDeep深拷贝

let _ = require('lodash')

let obj1 = {
    a: 1,
    b: {
        bb: {
            bbb: 2,
        },
    },
    c: 3,
}

let obj2 = _.cloneDeep(obj1)
obj2.b.bb.bbb = 22
console.log('obj1',obj1);
console.log('obj2',obj2);
上一篇下一篇

猜你喜欢

热点阅读