当前位置: 首页 > news >正文

深拷贝and浅拷贝!

一、什么是拷贝?什么是深拷贝和浅拷贝?

(1)拷贝:拷贝就是为了复用原对象的部分or全部数据,在原对象的基础上通过复制的方式创建一个新的对象。

拷贝对象可以分为三种类型:直接赋值、浅拷贝和深拷贝

 (2)直接赋值:并不会创建一个新的对象,而是将原对象的引用赋给新变量。因此,修改新变量会影响到原对象。

let obj1 = { name: "Alice", age: 25 };
let obj2 = obj1;

obj2.age = 30;
console.log(obj1); // { name: "Alice", age: 30 }
console.log(obj2); // { name: "Alice", age: 30 }

(3)浅拷贝浅拷贝会创建一个新的对象,仅复制对象的第一层属性。如果是简单数据类型拷贝值,引用数据类型(eg:对象、数组)拷贝的是地址。 如果是单层对象,没问题,如果有多层就有问题,修改嵌套对象会影响原对象。

 

(4)深拷贝会创建一个新的对象,并且递归地拷贝所有嵌套对象,使得新对象与原对象完全独立。

        (深拷贝会开辟新的栈,两个对象对应两个不同的地址,修改对象A的属性,并不会影响到对象B。)

 

二、浅拷贝实现方法

        浅拷贝会创建一个新的对象,但新对象中的属性如果是对象,则这些属性仍然指向原对象中的对应属性。因此,修改嵌套对象会影响到原对象。

1、Object.assign() 

let obj1 = { name: "Alice", age: 25, address: { city: "New York" } };
let obj2 = Object.assign({}, obj1);

obj2.age = 30;
obj2.address.city = "London";

console.log(obj1); // { name: "Alice", age: 25, address: { city: "London" } }
console.log(obj2); // { name: "Alice", age: 30, address: { city: "London" } }

2、使用展开运算符(...)实现 

let obj1 = { name: "Alice", age: 25, address: { city: "New York" } };
let obj2 = { ...obj1 };

obj2.age = 30;
obj2.address.city = "London";

console.log(obj1); // { name: "Alice", age: 25, address: { city: "London" } }
console.log(obj2); // { name: "Alice", age: 30, address: { city: "London" } }

三、深拷贝实现方法

        深拷贝会创建一个新的对象,并且递归地拷贝所有嵌套对象,使得新对象与原对象完全独立。

1、通过递归实现深拷贝

如果一个函数在内部可以调用其本身,那么这个函数就是递归函数

2、使用 JSON.parse 和 JSON.stringify 实现 

let obj1 = { name: "Alice", age: 25, address: { city: "New York" } };
let obj2 = JSON.parse(JSON.stringify(obj1));

obj2.age = 30;
obj2.address.city = "London";

console.log(obj1); // { name: "Alice", age: 25, address: { city: "New York" } }
console.log(obj2); // { name: "Alice", age: 30, address: { city: "London" } }

3、js库lodash里面cloneDeep内部实现了深拷贝 

import _ from 'lodash';
let obj = { a: 1, b: [2, 3] };
let copy = _.cloneDeep(obj);

相关文章:

  • python socket库详解
  • BigFoot Decursive lua
  • 使用 Dify 创建自然语言生成 Word 文档的应用(详细指南)
  • POCO F4刷机color 15
  • JS实现省份地级市的选择
  • 隔板法的本质,球盒问题
  • 深度学习笔记(37周)
  • [local-file-system]基于服务器磁盘的本地文件存储方案
  • centos7上安装Docker
  • (性能测试)性能测试工具 2.jmeter的环境搭建 3jmeter元件和4使用实例 5jmeter元件和参数化
  • 算法模型全解析:优缺点、场景适配与选择逻辑
  • 一次Milvus迁移的记录
  • Android 应用开发:架构重构、性能优化与离线缓存系统实现
  • CobaltStrike详细使用及Linux上线
  • Linux:进程程序替换
  • 寻找数字c++
  • iOS OC匹配多个文字修改颜色和字号
  • YOLO优化之多信息融合MIF
  • mesh开发解析
  • Express.js 是一个轻量级、灵活且功能强大的 Node.js Web 应用框架
  • 市自规局公告收回新校区建设用地,宿迁学院:需变更建设主体
  • 七方面118项任务,2025年知识产权强国建设推进计划印发
  • 纪念|古文字学泰斗裘锡圭:“还有很多事情要做”
  • 高盛上调A股未来12个月目标点位,沪深300指数潜在回报15%
  • 国家矿山安全监察局发布《煤矿瓦斯防治能力评估办法》
  • 李云泽:大型保险集团资本补充已经提上日程