首页 > 其他分享 >js 深拷贝

js 深拷贝

时间:2023-08-10 19:57:17浏览次数:25  
标签:Object value js source result memory 拷贝 else

转自:https://github.com/shfshanyue/Daily-Question/issues/203#issuecomment-888238489

/**
 * 深拷贝关注点:
 * 1. JavaScript内置对象的复制: Set、Map、Date、Regex等
 * 2. 循环引用问题
 * @param {*} object 
 * @returns 
 */
function deepClone(source, memory) {
  const isPrimitive = (value) => {
    return /Number|Boolean|String|Null|Undefined|Symbol|Function/.test(Object.prototype.toString.call(value));
  }
  let result = null;

  memory || (memory = new WeakMap());
  // 原始数据类型及函数
  if (isPrimitive(source)) {
    console.log('current copy is primitive', source);
    result = source;
  }
  // 数组
  else if (Array.isArray(source)) {
    result = source.map(value => deepClone(value, memory));
  }
  // 内置对象Date、Regex
  else if (Object.prototype.toString.call(source) === '[object Date]') {
    result = new Date(source);
  }
  else if (Object.prototype.toString.call(source) === '[object Regex]') {
    result = new RegExp(source);
  }
  // 内置对象Set、Map
  else if (Object.prototype.toString.call(source) === '[object Set]') {
    result = new Set();
    for (const value of source) {
      result.add(deepClone(value, memory));
    }
  }
  else if (Object.prototype.toString.call(source) === '[object Map]') {
    result = new Map();
    for (const [key, value] of source.entries()) {
      result.set(key, deepClone(value, memory));
    }
  }
  // 引用类型
  else {
    if (memory.has(source)) {
      result = memory.get(source);
    } else {
      result = Object.create(null);
      memory.set(source, result);
      Object.keys(source).forEach(key => {
        const value = source[key];
        result[key] = deepClone(value, memory);
      });
    }
  }
  return result;
}

 

标签:Object,value,js,source,result,memory,拷贝,else
From: https://www.cnblogs.com/beileixinqing/p/16611441.html

相关文章

  • Connect to Dababase using JDBC in JSP
    jsp连接数据库大全现在有好多初学jsp的网友经常会问数据库怎么连接啊,怎么老出错啊?所以我集中的在这写篇文章供大家参考,其实这种把数据库逻辑全部放在jsp里未必是好的做法,但是有利于初学者学习,所以我就这样做了,当大家学到一定程度的时候,可以考虑用MVC的模式开发。在练习这些代码的......
  • js大整数相加
    functionsum(a,b){letlen=Math.max(a.length,b.length)a=a.padStart(len,'0')b=b.padStart(len,'0')letcarry=0letresult=''for(leti=len-1;i>=0;i--){constsum=+a[i]++b[i]+carry......
  • 如何实现深浅拷贝?(前端)
    概念:深拷贝:将对象从内存中完整的拷贝一份出来,在堆中开辟一片新的区域存放新对象。浅拷贝:创建一个新对象,这个对象有原始对象的一份精确拷贝,如果拷贝的是基本数据类型,拷贝的就是基本数据类型的值;如果拷贝的是内存地址,拷贝的就是它的引用。区别:深拷贝修改新对象不会影响原对象,它们......
  • 什么是迭代器,生成器,装饰器;django的信号用过吗?如何用,干过什么;什么是深拷贝,什么是浅拷贝
    什么是迭代器,生成器,装饰器;django的信号用过吗?如何用,干过什么;什么是深拷贝,什么是浅拷贝,如何使用什么是迭代器,生成器,装饰器#迭代器-迭代:一种不依赖于索引取值的方式,我们不需要关注它的位置,只要能够一个个取值,它就称之为迭代,python中就是for循环,内部调用对象.__next__()-可迭......
  • Next.js - App Router Vs. Pages Router 详细对比
    多年来,我们将页面放置在Next的“pages”目录中。现在这种情况即将改变。不久前,Next.js推出了新的AppRouter,显着改变了我们创建页面的方式。但不仅是我们存储应用程序页面的目录发生了变化,而且可用的功能也发生了变化。我们的下一个项目过去是这样的:└──pages├......
  • Ubuntu 22.04安装Node.JS和NPM
    sudoaptpurgenodejssudoaptautoremovesudoaptupdatesudoaptinstall-ycurlcurl-fsSLhttps://deb.nodesource.com/setup_18.x|sudo-Ebash-sudoaptinstallnodejsbuild-essential-y......
  • 借助Aspose.Html 将 HTML 模板与 XML 或 JSON 合并
    在现代网络开发中,内容和表示的分离是一个基本原则。HTML模板提供了一种定义网页结构和布局的便捷方法,而JSON和XML数据格式通常用于存储和传输结构化信息。结合这些技术,开发人员可以根据外部源的数据动态生成HTML内容。在这篇博文中,我们将探讨如何在Java中将HTML模板与JS......
  • java中table遍历td js遍历table中的tr
    一、获取每一个tr1、通过table的id获取id="tables"获取第一行tr,索引从0开始,用eq(),方法里面的索引可以手动更换,如第二行就是1,也可以循环tr,eq里面就是循环变量$("#tablestr").eq(0);//遍历每一行for(vari=0;i<$("#tablestr").length;i++){ $("#tablestr").eq(i);......
  • 8.利用Filebeat收集Nginx的Json格式访问日志和错误日志到Elasticsearch
    生产环境中经常需要获取Web访问用户的信息,比如:网站的PV,UV,状态码,用户来自哪个地区,访问时间等可以通过收集的Nginx的访问日志实现默认Nginx的每一次访问生成的访问日志是一行文本,ES没办法直接提取有效信息,不利于后续针对特定信息的分析可以将Nginx访问日志转换为JSON......
  • springboot~alibaba.fastjson2序列化时过滤字段
    当我们使用阿里的alibaba.fastjson2进行json序列化时,你可以通过方法参数PropertyFilter来实现对字段的获取,将需要序列化的字段写到PropertyFilter对象里,当然也可以将不进行序列化的写到这里,进行逻辑非操作即可实体classPerson{privateStringfirstName;privateStr......