美文网首页js知识点前端知识点ES6~ES12
JSON对象的深拷贝和浅拷贝

JSON对象的深拷贝和浅拷贝

作者: 听书先生 | 来源:发表于2021-05-05 18:04 被阅读0次

    1、JSON.stringify()实现对象的深拷贝

    官网上解释说明的是序列化对象类型(指的将对象转为字符串类型)
    直接复制原始对象所有数据,并脱离原始对象;不会对原始对象造成影响;需要注意的事项:以下类型key对象会失丢;

    • function函数类型
    • undefined数据类型
    • Symbol()数据类型
          let obj = {
            name: "xiaochen",
            age: 20,
          };
          let copy_obj = JSON.parse(JSON.stringify(obj));
          obj.age = 30;
          console.log("初始对象: ", obj);
          console.log("深拷贝之后的对象: ", copy_obj);
    
    image.png
    深拷贝将原始对象的所有数据全部拷一份单独弄出来,这样修改原对象,就不会对初始数据进行修改,这种深拷贝方式之前我一直用于表单的编辑操作,因为vue中数据是双向绑定的,不进行拷贝操作的话,直接修改表单,表单外展示的数据也会同样的被修改掉,但是这个深拷贝的方式是有弊端的,有些类型会被直接过滤掉。
    示例:
          let obj = {
            name: "xiaochen",
            age: 20,
            userId: Symbol("id"),
            custom: undefined,
            fn() {
              console.log("测试深拷贝函数类型");
            },
          };
    
          let copy_obj = JSON.parse(JSON.stringify(obj));
          obj.age = 30;
          console.log("初始对象: ", obj);
          console.log("深拷贝之后的对象: ", copy_obj);
    
    image.png

    2、使用递归方式去实现深拷贝

    深拷贝的函数方法:

    deepCopy(object) {
      // 判断当前传入的类型
      let copyObj = object.construct === "Array" ? [] : {};
       for (let keys in object) {
         copyObj[keys] =object[keys] && typeof object[keys] === "object" ? deepCopy(object[keys]) : object[keys];
       }
       return copyObj;
    },
    

    修改原对象数据并掉起深拷贝函数:

    let obj = {
       name: "xiaochen",
       age: 20,
       userId: Symbol("id"),
       custom: undefined,
       fn() {
        console.log("测试深拷贝函数类型");
       },
       };
    let copy_obj = this.deepCopy(obj);
    obj.age = 30;
    console.log("初始对象: ", obj);
    console.log("深拷贝之后的对象: ", copy_obj);
    
    image.png

    这样就解决了JSON.stringify()的局限性

    3、对象的浅拷贝

    只是单纯的复制原始对象的第一层数据,第二层及以下数据还是原始数据对象的引用,浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。

    // 数组
    const arr = [1, 2, 3]
    const arrCopy = [...arr]
    
    // 对象
    const obj = { a: 1 }
    const objCopy = { ...obj }
    

    相关文章

      网友评论

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

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