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>


相关文章
|
3月前
|
JSON JavaScript 前端开发
JavaScript实现字符串转json对象的方法
JavaScript实现字符串转json对象的方法
|
12天前
|
JSON JavaScript 前端开发
|
20天前
|
JSON 人工智能 算法
探索LLM推理全阶段的JSON格式输出限制方法
文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
|
1月前
|
JSON 前端开发 JavaScript
json字符串如何转为list对象?
json字符串如何转为list对象?
193 7
|
1月前
|
JSON JavaScript 前端开发
js如何格式化一个JSON对象?
js如何格式化一个JSON对象?
63 3
|
2月前
|
XML JSON JavaScript
JSON对象的stringify()和parse()方法使用
本文阐述了JSON对象的`stringify()`和`parse()`方法的用法,包括如何将JavaScript对象转换为JSON字符串,以及如何将JSON字符串解析回JavaScript对象,并讨论了转换过程中需要注意的事项。
JSON对象的stringify()和parse()方法使用
|
2月前
|
JSON 前端开发 中间件
React读取properties配置文件转化为json对象并使用在url地址中
本文介绍了如何在React项目中读取properties配置文件,将其内容转化为JSON对象,并在请求URL地址时使用这些配置。文章详细说明了异步读取文件、处理字符串转换为JSON对象的过程,并提供了一个封装函数,用于在发起请求前动态生成配置化的URL地址。
75 1
|
3月前
|
存储 JSON JavaScript
|
24天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
10天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。