2、对象拷贝(浅拷贝、深拷贝)、深拷贝的两种方法(递归、转JSON)

简介: 2、对象拷贝(浅拷贝、深拷贝)、深拷贝的两种方法(递归、转JSON)

1、为什么要对象拷贝?


  • 对象作为函数参数的时候,返回一个全新的对象,不希望操作原对象,就时候就需要对象拷贝,也叫对象克隆


2、浅拷贝


  • 只能拷贝第一层级的。深层的不能拷贝(就是里面属性也是一个对象),拷贝的属性仍然是指向同一个对象,数据改变时也会影响到原始对象的数据


    // 对象拷贝(克隆):对象作为函数参数的时候,不希望操作原对象
    let stu = { name: "jasmine", age: 18, friend: { name: "qiqi" } };
    // 浅拷贝:只能拷贝第一层级的
    // 深层的不能拷贝(就是属性值也是一个对象),仍然是指向同一个对象
    function copyObject(obj) {
      let newObj = {};
      for (let i in obj) {
        newObj[i] = obj[i];
      }
      return newObj;
    }
    let newStu = copyObject(stu);
    newStu.age = 20;
    newStu.friend.name = "jasmine";
    console.log(stu);
    console.log(newStu);
    /*
    输出结果:
    stu = { name: "jasmine", age: 18, friend: { name: "jasmine" } };
    newStu = { name: "jasmine", age: 20, friend: { name: "jasmine" } };
    */


3、深拷贝


  • 所有的层级的数据都拷贝过来,不放过一个属性,拷贝指向的对象都是一个全新的对象,不影响原始对象的数据


// 深拷贝:所有的层级的数据都拷贝过来,不放过一个属性
    function copyObject(obj) {
      let newObj = {};
      for (let i in obj) {
        // 递归(实现深度拷贝)
        if (obj[i] instanceof Object) {
          newObj[i] = copyObject(obj[i]);
        } else {
          newObj[i] = obj[i];
        }
      }
      return newObj;
    }
    let newStu = copyObject(stu);
    newStu.name = "qiqi";
    newStu.friend.name = "qiqi";
    console.log(stu);
    console.log(newStu);
    /*
    输出结果:
    stu = { name: "jasmine", age: 18, friend: { name: "jasmine" } };
    newStu = { name: "jasmine", age: 20, friend: { name: "qiqi" } };
    */


4、浅拷贝与深拷贝的区别


类型 区别
浅拷贝 只拷贝第一层级的数据,深层的属性对象仍然指向同一个对象,数据改变时影响原始对象
深拷贝 所有层级的数据都拷贝过来,数据改变时,不影响原始对象


4、深拷贝的两种方法(递归、转JSON)

<script>
    // 对象拷贝(克隆):对象作为函数参数的时候,不希望操作原对象
    var stu = { name: "jasmine", age: 18, friend: { name: "jasmine" } };
    // 深拷贝:所有的层级的数据都拷贝过来,不放过一个属性
    function copyObject(obj) {
      let newObj = {};
      // 1、递归(实现深度拷贝)
      for (let i in obj) {
        if (obj[i] instanceof Object) {
          newObj[i] = copyObject(obj[i]);
        } else {
          newObj[i] = obj[i];
        }
      }
      // 2、转JSON
      let newStr = JSON.stringify(obj);
      newObj = JSON.parse(newStr);
      return newObj;
    }
    var newStu = copyObject(stu);
    newStu.name = "qiqi";
    newStu.friend.name = "qiqi";
    console.log(stu);
    console.log(newStu);
    /*
    输出结果:
    stu = { name: "jasmine", age: 18, friend: { name: "jasmine" } };
    newStu = { name: "jasmine", age: 20, friend: { name: "qiqi" } };
    */
  </script>


相关文章
|
1月前
|
JSON 中间件 Java
【GoGin】(3)Gin的数据渲染和中间件的使用:数据渲染、返回JSON、浅.JSON()源码、中间件、Next()方法
我们在正常注册中间件时,会打断原有的运行流程,但是你可以在中间件函数内部添加Next()方法,这样可以让原有的运行流程继续执行,当原有的运行流程结束后再回来执行中间件内部的内容。​ c.Writer.WriteHeaderNow()还会写入文本流中。可以看到使用next后,正常执行流程中并没有获得到中间件设置的值。接口还提供了一个可以修改ContentType的方法。判断了传入的状态码是否符合正确的状态码,并返回。在内部封装时,只是标注了不同的render类型。再看一下其他返回的类型;
163 3
|
5月前
|
JSON IDE Java
鸿蒙开发:json转对象插件回来了
首先,我重新编译了插件,进行了上传,大家可以下载最新的安装包进行体验了,还是和以前一样,提供了在线版和IDE插件版,两个选择,最新的版本,除了升级了版本,兼容了最新的DevEco Studio ,还做了一层优化,就是针对嵌套对象和属性的生成,使用方式呢,一年前的文章中有过详细的概述,这里呢也简单介绍一下。
228 4
鸿蒙开发:json转对象插件回来了
|
11月前
|
JSON 人工智能 算法
探索大型语言模型LLM推理全阶段的JSON格式输出限制方法
本篇文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
1517 48
|
JSON 人工智能 算法
探索LLM推理全阶段的JSON格式输出限制方法
文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
2205 52
|
JSON 前端开发 JavaScript
json字符串如何转为list对象?
json字符串如何转为list对象?
1927 7
|
JSON JavaScript 前端开发
js如何格式化一个JSON对象?
js如何格式化一个JSON对象?
520 3
|
XML JSON JavaScript
JSON对象的stringify()和parse()方法使用
本文阐述了JSON对象的`stringify()`和`parse()`方法的用法,包括如何将JavaScript对象转换为JSON字符串,以及如何将JSON字符串解析回JavaScript对象,并讨论了转换过程中需要注意的事项。
JSON对象的stringify()和parse()方法使用
|
JSON 前端开发 中间件
React读取properties配置文件转化为json对象并使用在url地址中
本文介绍了如何在React项目中读取properties配置文件,将其内容转化为JSON对象,并在请求URL地址时使用这些配置。文章详细说明了异步读取文件、处理字符串转换为JSON对象的过程,并提供了一个封装函数,用于在发起请求前动态生成配置化的URL地址。
361 1
|
1月前
|
JSON API 数据格式
淘宝拍立淘按图搜索API系列,json数据返回
淘宝拍立淘按图搜索API系列通过图像识别技术实现商品搜索功能,调用后返回的JSON数据包含商品标题、图片链接、价格、销量、相似度评分等核心字段,支持分页和详细商品信息展示。以下是该API接口返回的JSON数据示例及详细解析: