首页 > 其他分享 >第七篇 手写原理代码 - 对象 【 实现对象的深度拷贝、实现对象的深度对比 】

第七篇 手写原理代码 - 对象 【 实现对象的深度拷贝、实现对象的深度对比 】

时间:2023-04-11 23:24:35浏览次数:42  
标签:instanceof obj 对象 第七篇 深度 return 拷贝 属性

在 JavaScript 中,对象拷贝可以分为浅拷贝和深拷贝两种方式

1、浅拷贝

  浅拷贝只是复制了对象的引用地址,新对象的属性与原对象的属性指向同一块内存地址
  
2、深拷贝

  深拷贝会完整地复制对象以及其内部所有嵌套对象  
  
使用 JSON.parse(JSON.stringify()) 方法进行深拷贝时,需要注意以下几点:

 1、对象属性值只能是基本数据类型、数组或对象字面量,不能包含方法、正则表达式等特殊类型
 
 2、对象中存在循环引用时会报错

1、实现对象的深度拷贝

function deepClone(obj, hash = new WeakMap()) {
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof RegExp) return new RegExp(obj);
  if (typeof obj !== 'object' || obj === null) return obj;
  if (hash.has(obj)) return hash.get(obj);

  const clone = new obj.constructor();
  hash.set(obj, clone);
  
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {  // 处理自有属性
      clone[key] = deepClone(obj[key], hash);  // 如果是对象,则递归复制
    }
  }
  
  return clone;
}

2、实现对象的深度对比

以下方法仅考虑了对象的可枚举属性,如果对象还包含不可枚举属性(例如通过 Object.defineProperty 方法定义的属性),则需要使用 Object.getOwnPropertyNames() 方法来获取所有属性名称,从而实现完整的深度对比。

function deepEqual(a, b) {
  if (a === b) return true;

  if (a instanceof Date && b instanceof Date) {
    return a.getTime() === b.getTime();
  }
  
  if (a instanceof RegExp && b instanceof RegExp) {
    return a.toString() === b.toString();
  }

  if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) {
    return false;
  }

  const propsA = Object.getOwnPropertyNames(a);
  const propsB = Object.getOwnPropertyNames(b);

  if (propsA.length !== propsB.length) {
    return false;
  }

  for (let i = 0; i < propsA.length; i++) {
    const prop = propsA[i];

    const isEqual = deepEqual(a[prop], b[prop]);

    if (!isEqual) {
      return false;
    }
  }

  return true;
}

标签:instanceof,obj,对象,第七篇,深度,return,拷贝,属性
From: https://www.cnblogs.com/caix-1987/p/17308244.html

相关文章

  • 第八篇 手写原理代码 - 对象 【 实现 Object.assign() 和 Object.create() 】
    1、Object.assign(target,...sources)Object.assign()方法用于将一个或多个源对象的属性复制到目标对象中。它只复制源对象自身可枚举的属性,同时也能够拷贝getter和setter函数2、Object.create(proto[,propertiesObject])Object.create()方法创建一个新对象,使......
  • JSON数据与java对象转换
    JSON数据与java对象转换环境:导入依赖:<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency>样例:publicstaticvoidmain(String[]args){//1.将java对象转换为ja......
  • Python爬图片(面向对象版)
    importrequestsfromlxmlimportetreefromthreadingimportThreadclassSpider(object):def__init__(self):self.header={"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chro......
  • sqlalchemy快速插入数据,scoped_session线程安全,加载类上的装饰器,基本增删改查,django中
    今日内容sqlalchemy快速插入数据sqlalchemy是什么orm框架,跟其他web框架没有必然联系,可以独立使用安装,快速使用,执行原生sql创建表和删除表不能创建数据库不能修改字段(增加,删除)使用orm插入第一步:生成engine对象engine=create_engine("mysql+pymysql://[email protected].......
  • Pandas Query 方法深度总结,你学会了吗?
    [PandasQuery方法深度总结,你学会了吗?-51CTO.COM](https://www.51cto.com/article/714736.html) 数据库其他数据库事实证明实际上可以使用query()​方法做到这一点。因此,在今天的文章中,我们将展示如何使用query()方法对数据框执行查询。大多数Pandas用户都熟悉 ilo......
  • 如何判断一个对象的全部属性都是null
    根据反射机制获取对象的所有属性,然后立flag,判断每个属性是否都是nullFieldsfields=obj.getClass().getDeclaredFields;booleanflag=false;for(Fieldfield:fields){field.setAccessible(true);    if(field.get(obj)!=null&&StringUtils.isNotBlank(field.g......
  • 论文《深度多尺度卷积LSTM网络的出行需求和出发地预测》
    学习参考:https://blog.csdn.net/zuiyishihefang/article/details/128030409论文题目:《DeepMulti-ScaleConvolutionalLSTMNetworkforTravelDemandandOrigin-DestinationPredictions》是2020年发表在IEEE的文章。出处:IEEETransactionsonIntelligentTransportationS......
  • 关于S3对象加密以及S3-bucket桶默认加密的配置
    今天在看到一个s3中的对属性时,发现服务端加密显示的Off,那么就意味着这个对象是没有使用加密的 但笔者就一直思考了、怎么会没有加密呢,关于s3-bucket和对象,都找不到地方是可以关闭加密的呢,后面去看了一下官方文档:Protectingdatausingserver-sideencryption-AmazonSi......
  • 事实胜于雄辩,苹果MacOs能不能玩儿机器/深度(ml/dl)学习(Python3.10/Tensorflow2)
    坊间有传MacOs系统不适合机器(ml)学习和深度(dl)学习,这是板上钉钉的刻板印象,就好像有人说女生不适合编程一样的离谱。现而今,无论是Pytorch框架的MPS模式,还是最新的Tensorflow2框架,都已经可以在M1/M2芯片的Mac系统中毫无桎梏地使用GPU显卡设备,本次我们来分享如何在苹果MacOS系统上......
  • 面向对象
    面向过程&面向对象面向过程思想步骤清晰简单,第一步做什么,第二步做什么.....面对过程适合处理一些较为简单的问题。面向对象思想物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。面向对......