首页 > 其他分享 >记录--Object.assign 这算是深拷贝吗

记录--Object.assign 这算是深拷贝吗

时间:2024-01-18 16:57:28浏览次数:23  
标签:const -- Object console 对象 obj 拷贝 assign

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

在JavaScript中,Object.assign() 是一个用于合并对象属性的常见方法。然而,对于许多开发者来说,关于它是否执行深拷贝的认识可能存在一些混淆。先说答案Object.assign() 不属于深拷贝,我们接着往下看。

Object.assign() 概览

首先,让我们回顾一下 Object.assign() 的基本用法。该方法用于将一个或多个源对象的属性复制到目标对象,并返回目标对象。这一过程是浅拷贝的,即对于嵌套对象或数组,只是拷贝了引用而非创建新的对象。

const obj = { a: 1, b: { c: 2 } };
const obj2 = { d: 3 };

const mergedObj = Object.assign({}, obj, obj2);

console.log(mergedObj);
// 输出: { a: 1, b: { c: 2 }, d: 3 }

浅拷贝的陷阱

浅拷贝的特性意味着如果源对象中包含对象或数组,那么它们的引用将被复制到新的对象中。这可能导致问题,尤其是在修改新对象时,原始对象也会受到影响。

const obj = { a: 1, b: { c: 2 } };
const clonedObj = Object.assign({}, obj);
clonedObj.b.c = 3;

console.log(obj);         // { a: 1, b: { c: 3 } }
console.log(clonedObj);   // { a: 1, b: { c: 3 } }

在这个例子中,修改 clonedObj 的属性也会影响到原始对象 obj

因此,如果我们需要创建一个全新且独立于原始对象的拷贝,我们就需要进行深拷贝。而 Object.assign() 并不提供深拷贝的功能。

深拷贝的需求

如果你需要进行深拷贝而不仅仅是浅拷贝,就需要使用其他的方法,如使用递归或第三方库来实现深度复制。以下是几种常见的深拷贝方法:

1. 使用 JSON 序列化和反序列化

const obj = { a: 1, b: { c: 2 } };
const deepClonedObj = JSON.parse(JSON.stringify(obj));
deepClonedObj.b.c = 3;

console.log(obj);            // { a: 1, b: { c: 2 } }
console.log(deepClonedObj);  // { a: 1, b: { c: 3 } }

这种方法利用了 JSON 的序列化反序列化过程,通过将对象转换为字符串,然后再将字符串转换回对象,实现了一个全新的深拷贝对象。

需要注意的是,这种方法有一些限制,例如无法处理包含循环引用的对象,以及一些特殊对象(如 RegExp 对象)可能在序列化和反序列化过程中失去信息。

2. 使用递归实现深拷贝

function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj;
  }

  const clonedObj = Array.isArray(obj) ? [] : {};

  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      clonedObj[key] = deepClone(obj[key]);
    }
  }

  return clonedObj;
}

const obj = { a: 1, b: { c: 2 } };
const deepClonedObj = deepClone(obj);
deepClonedObj.b.c = 3;

console.log(obj);            // { a: 1, b: { c: 2 } }
console.log(deepClonedObj);  // { a: 1, b: { c: 3 } }

这是一个递归实现深拷贝的方法。它会递归地遍历对象的属性,并创建它们的副本。这种方法相对灵活,可以处理各种情况。

但需要注意在处理大型对象或深度嵌套的对象时可能会导致栈溢出。

3. 使用第三方库

许多第三方库提供了强大而灵活的深拷贝功能,其中最常用的是 lodash 库中的 _.cloneDeep 方法。

const _ = require('lodash');

const obj = { a: 1, b: { c: 2 } };
const deepClonedObj = _.cloneDeep(obj);
deepClonedObj.b.c = 3;

console.log(obj);            // { a: 1, b: { c: 2 } }
console.log(deepClonedObj);  // { a: 1, b: { c: 3 } }

使用第三方库的优势在于它们通常经过精心设计和测试,可以处理更多的边界情况,并提供更好的性能。

本文转载于:

https://juejin.cn/post/7325040809697591296

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:const,--,Object,console,对象,obj,拷贝,assign
From: https://www.cnblogs.com/smileZAZ/p/17972854

相关文章

  • 为文件一键命名为其md5值
    为文件一键命名为其md5值不知道怎么给文件命名?一键命名为其md5不就是了!单文件拖拽版无需启动,直接将文件拖拽到.bat文件上@echooffsetlocalenabledelayedexpansion::获取文件完整路径set"file_path=%~1"::检查文件是否存在ifnotexist"!file_path!"(echoF......
  • 图书管理员是做什么的,工作内容有哪些
    图书管理员是做什么的,工作内容有哪些 图书管理员是负责管理图书馆的日常工作,包括图书的收集、分类、借阅、归还以及图书馆的运营和管理。图书管理员的主要工作内容包括:1.图书采购和编目:图书管理员需要负责购买和接收新书,并对其进行编目,以便其他图书馆员能够快速地......
  • BOSHIDA 探索直流电源模块的应用领域
    BOSHIDA探索直流电源模块的应用领域直流电源模块广泛应用于许多领域,包括电子设备、通信、工业自动化、航空航天等。以下是一些常见的应用领域: 1.电子设备:直流电源模块用于给各种电子设备供电,如计算机、手机、平板电脑、摄像机等。2.通信:直流电源模块用于为通信设备供电,如......
  • js.dom2
    复选框:input.checked=false;onload事件会在页面或图像加载完成后立即发生。<bodyonload="init()">functioninit(){setTimeout("showAD()",2000);}functioninit(){setInterval("changImg()",1);}正则表达式:用字符串来规定字符串的格式......
  • RTSP流截图并剔除花屏图片
    大致代码如下:importcv2importnumpyasnpfromfastapiimportHTTPExceptionRgbRangeType=tuple[tuple[int,int,int],tuple[int,int,int]]classValidationError(HTTPException):def__init__(self,detail:str,status_code=400)->None:supe......
  • GB28181智慧安防视频监控EasyCVR v3.5系统增加录像保存地址的配置
    智慧安防监控EasyCVR视频管理平台能在复杂的网络环境中,将前端设备统一集中接入。在网络传输上,平台支持设备通过4G、5G、WIFI、有线等方式进行视频流的快捷传输,视频流经平台处理后可对外进行多格式的分发,实现多展示终端观看(电脑、大屏、电视墙、手机端等)。国标GB28181协议EasyCVR安......
  • (六):映射配置(_mapping)
    映射配置与关系数据库中表的DDL类似,在ES中映射时定义文档的过程,定义了文档包含哪些字段,并对文档字段是否保存、是否索引、是否分词等进行设置。1、查看映射字段GET/索引名/_mapping详情如下:2、创建映射字段创建映射字段语法:PUT/索引库名/_mapping/类型名......
  • FeatInsight: 基于 OpenMLDB 的特征平台助力高效的特征管理和编排
    OpenMLDB社区新开源了特征平台产品-FeatInsight(https://github.com/4paradigm/FeatInsight),是一个先进的特征存储(FeatureStore)服务,基于OpenMLDB数据库实现高效的特征管理和编排功能。FeatInsight特征平台提供简便易用的UI界面,用户可以进行机器学习特征开发的全流程,包括......
  • 数据库索引和索引优化
    索引和索引优化MysqlInnoDB使用B+树作为索引,如下图,是一个简化的B+数:使用B+树作为索引有点非常明显的优点1、B+树的数据都保存在叶子节点中,非叶子节点只保存指针,这样可以极大的减少数的阶数。如图如果每一阶可以存储1000个值,那么3阶树即可以存储1000*1000*1000=10亿个数据。而根......
  • (7)Powershell算术运算符
    (7)Powershell算术运算符本系列博客从这一节开始是Powershell的语法知识,在开始学习语法之前,希望你对Powershell有个基本的了解,比如开发工具的使用,面向对象等特性,详细内容使劲戳这里(1)-(6)的内容。本节主要介绍Powershell中的算术运算符。Powershell支持以下算术运算符......