美文网首页
对象的浅拷贝和深拷贝

对象的浅拷贝和深拷贝

作者: Rui___ | 来源:发表于2019-11-05 15:19 被阅读0次

对象的深拷贝和浅拷贝

//拷贝出来的结果 和以前没关系 叫深拷贝
let school = { name: "王星星", age: 10 };
let my = { address: "回龙观" };
let newObj = { ...school, ...my };
console.log(newObj);//{ name: '王星星', age: 10, address: '回龙观' }
console.log(school)//{ name: '王星星', age: 10 }
newObj.age=20;//
console.log(newObj)//{ name: '王星星', age: 20, address: '回龙观' }
console.log(school)//{ name: '王星星', age: 10 }

//...如果用的是多层对象 那就是浅拷贝
let school = { name: "王星星", age: 10 ,a:{b:2}};
let my = { address: "回龙观" };
let newObj = { ...school, ...my };
console.log(newObj);//
console.log(school)//
newObj.a.b=20;//
console.log(newObj)//
console.log(school)//

如何 实现一个深拷贝 递归拷贝
1、外部库 lodash =>cloneDeep
2、自实现

// 1) 怎么判断数据的类型
// typeof object Array
// Object.prototype.toString.call()
// instanceof 可以判断类型 判断是谁的实例
// constructor 构造函数

const deepClone = (value ,hash = new WeakMap) => {
    if(value == null) return value; // 排除掉null 和undefine 的情况
    if(typeof value !== 'object') return value; // 这里包含了函数类型
    if(value instanceof RegExp) return new RegExp(value);
    if(value instanceof Date) return new Date(value);
    // .....
    // 拷贝的人可能是一个对象 或者是一个数组 (循环)  for in 
    let instance = new value.constructor; // 根据当前属性构造一个新的实例
    if(hash.has(value)){ // 先去hash中查看一下是否存在过 ,如果存在就把以前拷贝的返回去 
        return hash.get(value); // 返回已经拷贝的结果
    }
    hash.set(value,instance);// 没放过就放进去
    // 用一个对象来记忆
    for(let key in value){ // 一层
        if(value.hasOwnProperty(key)){ // 将hash 继续向下传递 保证这次拷贝能拿到以前拷贝的结果
            instance[key] = deepClone(value[key],hash); // 产生的就是一个新的拷贝后的结果
        }// 过滤掉原型链上的属性
    }
    return instance
};


let school = {
    name: "老肥",
    age: 10,
    a: { b: {c:45} },
    fn: () => {},
    c: undefined,
    reg: /\d+/
  };

  let obj1 = deepClone(school);
  obj1.a.b.c="王菲"
  console.log(obj1);
  console.log(school)

相关文章

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • day 9

    浅拷贝和深拷贝 copy.copy(对象):浅拷贝 copy.deepcopy(对象):深拷贝 copy.copy...

  • 浅拷贝和深拷贝与(基本复杂类型)数组去重

    对象浅拷贝和深拷贝 //浅拷贝 //深拷贝 所有继承了 Object 的对象都会继承到 hasOwnPropert...

  • 五、面试总结(五)

    对象 拷贝(clone) 如何实现对象克隆 深拷贝和浅拷贝区别 深拷贝和浅拷贝如何实现激活机制 写clone()方...

  • Cloneable 接口

    浅拷贝(shallow clone)和深拷贝(deep clone) 浅拷贝是指拷贝对象时仅仅拷贝对象本身和对象中...

  • day9-函数基础

    一、浅拷贝和深拷贝 import copycopy.copy(对象):浅拷贝copy.deepcopy(对象):深...

  • iOS 中 load 和 initialize 方法调用机制

    深拷贝和浅拷贝 深拷贝同浅拷贝的区别:浅拷贝是指针拷贝,对一个对象进行浅拷贝,相当于对指向对象的指针进行复制,产生...

  • JS中对象的复制

    JS中的对象复制分为两种情况:深拷贝和浅拷贝。深拷贝和浅拷贝的区别在于对数组和对象的拷贝,对它们拷贝时浅拷贝只是拷...

网友评论

      本文标题:对象的浅拷贝和深拷贝

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