美文网首页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 }

相关文章

  • 2018-10-10函数基础

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

  • java 对象的拷贝

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

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

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

  • 对象深拷贝和浅拷贝

    浅拷贝 深拷贝 深拷贝的递归方法 深拷贝的JSON方法

  • 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 方法调用机制

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

网友评论

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

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