当前位置 博文首页 > 纸飞机博客:深拷贝/浅拷贝

    纸飞机博客:深拷贝/浅拷贝

    作者:[db:作者] 时间:2021-09-07 10:11

    浅拷贝:将原对象或原数组的引用直接赋 给新对象,新数组。新对象/数组只是原对象的一个引用。只是增加了一个指针指向已存在的内存地址。

    深拷贝:创建一个新的对象和数组,将原 对象的各项属性的“值”(数组的所有元 素 ) 拷 贝 过 来 , 是 “ 值 ” 而 不 是 “ 引 用”。是增加了一个指针并且申请了一个 新的内存,使这个增加的指针指向这个新 的内存。

    注意:像“深”拷贝第一层级的对象属性或数组元素,也是浅拷贝。真正深拷贝是拷贝多层,每一级别的数据都会拷贝出来,之后就会完全独立,更改原对象,拷贝对象不会发生变化。

    浅拷贝

    //拷贝一层,对象是拷贝的引用类型,其他都是直接将值传递
    function simpleClone(initalObj) {
        var obj = {};
        for (var i in initalObj) {
            obj[i] = initalObj[i];
        }
        return obj;
    }

    Object.assign()方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。是浅拷贝。?

    Object.assign(target, ...sources)

    深拷贝

    //用JSON.stringify把对象转成字符串,再用JSON. parse把字符串转成新的对象。
    var objl = {body: {a: 10}};
    var obj2 = JSON.parse(JSON.stringfy(obj1));

    递归实现拷贝

    function deepClone(obj){
      let objClone =  Array.isArray(obj) ? [] : {};
      if (obj && typeof obj === 'object') {
        for(let key in obj){
          if (obj[key] && typeof obj[key] === 'object'){
            objClone[key] = deepClone(obj[key]);
          }else{
            objClone[key] = obj[key]
          }
        }
      }
      return objClone;
    }
    cs
    下一篇:没有了