js 实现深拷贝(全)

这篇具有很好参考价值的文章主要介绍了js 实现深拷贝(全)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、使用第三方库

使用 lodashcloneDeep() 方法(详情可见 lodash 中文官网)

import lodash from 'lodash';

let obj = {
  a: {
    b: '阿潔'
  },
  c: '深拷贝'
}

const newObj = lodash.cloneDeep(obj)

二、简单深拷贝

除了基本数据类型(null、string、boolean、undefined、number、symbol),引用数据类型中 如果对象中不存在时间类型和正则表达式等类型对象,则可用简单的JSON序列化进行转化。

let cloneObj = JSON.parse(JSON.stringify(obj))

注意:如果对象内容项为undefined,null,Date,RegExp、function… 则不推荐使用此深拷贝可能会出问题文章来源地址https://www.toymoban.com/news/detail-603803.html

三、递归版

1、考虑到存在Date和正则表达式的深拷贝(考虑最全相对复杂的一种深拷贝)
export function cloneDeep(data) {
  //string,number,bool,null,undefined,symbol
  //object,array,date
  if (data && typeof data === "object") {
    //针对函数的拷贝
    if (typeof data === "function") {
      let tempFunc = data.bind(null);
      tempFunc.prototype = cloneDeep(data.prototype);
      return tempFunc;
    }
    // 根据不同的数据类型的深拷贝
    switch (Object.prototype.toString.call(data)) {
      case "[object String]":
        return data.toString();
      case "[object Number]":
        return Number(data.toString());
      case "[object Boolean]":
        return new Boolean(data.toString());
      case "[object Date]":
        return new Date(data.getTime());
      case "[object Array]":
        var arr = [];
        for (let i = 0; i < data.length; i++) {
          arr[i] = cloneDeep(data[i]);
        }
        return arr;

      //js自带对象或用户自定义类实例
      case "[object Object]":
        var obj = {};
        for (let key in data) {
          //会遍历原型链上的属性方法,可以用hasOwnProperty来控制 (obj.hasOwnProperty(prop)
          obj[key] = cloneDeep(data[key]);
        }
        return obj;
    }
  } else {
    //string,number,bool,null,undefined,symbol
    return data;
  }
}
2、不考虑Date和正则表达式的深拷贝(上面的简化版,也是常用的一种)
function cloneDeep (target) {
  // 判断是否是对象
  if (typeof target === 'object') {
    // 兼容数组与对象
    let obj = Array.isArray(target) ? [] : {}
    for (let key in target) {
      obj[key] = cloneDeep(target[key])
    }
    return obj
  } else {
    return target
  }
}

到了这里,关于js 实现深拷贝(全)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端面试题---深拷贝、浅拷贝的实现和解构赋值

    在 JavaScript 中实现深拷贝和浅拷贝可以采用不同的方法。下面分别介绍这两种拷贝方式的实现方式 1.浅拷贝(Shallow Copy) 浅拷贝(shallow copy)是一种复制对象或数组的操作,创建一个新的对象或数组,并将原始对象或数组的属性或元素的引用复制到新的对象或数组中。这意味

    2024年02月08日
    浏览(85)
  • js 实现深拷贝(全)

    使用 lodash 的 cloneDeep() 方法(详情可见 lodash 中文官网) 除了基本数据类型( null、string、boolean、undefined、number、symbol ),引用数据类型中 如果对象中不存在时间类型和正则表达式等类型对象,则可用简单的JSON序列化进行转化。 注意:如果对象内容项为undefined,null,Date,Reg

    2024年02月16日
    浏览(29)
  • Js实现深拷贝的4种方式

    概念 深拷贝:在堆内存中重新开辟一个存储空间,完全克隆一个一模一样的对象; 浅拷贝:不在堆内存中重新开辟空间,只复制栈内存中的引用地址。 本质上两个对象(数组)依然指向同一块存储空间在这里插入代码片 1、递归方式(推荐,项目中最安全最常用) 2、JSON.

    2024年02月13日
    浏览(36)
  • JS实现深拷贝的4种方法

    本文主要给大家介绍了关于JS实现深拷贝的4种方式,深拷贝是指将一个对象完整地拷贝一份,不受原对象影响,文中通过示例代码介绍的非常详细,需要的朋友可以参考下 深拷贝:在堆内存中重新开辟一个存储空间,完全克隆一个一模一样的对象; 浅拷贝:不在堆内存中重新开辟

    2024年02月04日
    浏览(36)
  • JS实现深拷贝的几种方法

    这是最简单的方法。 通过递归的方式深度遍历对象,将每个属性的值进行复制。需要处理被复制对象为值类型的情况以及属性值中包含对象的情况。需要注意的是,为了防止循环引用导致死循环,需要记录已经遍历过的对象。 Lodash Lodash 是一个一致性、模块化、高性能的 J

    2024年02月11日
    浏览(53)
  • jQuery.js - 前端必备的Javascript库

    作者: WangMin 格言: 努力做好自己喜欢的每一件事 jQuery.js 是什么? jQuery是一个快速简洁、免费开源易用的JavaScript框架, 倡导写更少的代码,做更多的事情 。它封装JavaScript常用的功能代码,提供了一种简便的JavaScript设计模式,以及我们开发中常用到的操作DOM的API,优化HTML文

    2024年02月05日
    浏览(70)
  • JavaScript之深度克隆、多种实现方式、列举各种方式的优缺点、对象自有属性、拷贝、复制

    在 JavaScript 中,对象和数组是引用类型,当将一个对象或数组赋值给另一个变量时,它们实际上是共享同一块内存空间。这意味着对一个对象或数组的修改会影响到所有引用它的变量。 为了创建一个独立的副本,可以使用深克隆。 JSON.stringify() 方法将 JavaScript 对象转换为一个

    2024年02月02日
    浏览(43)
  • web前端面试-- js深拷贝的一些bug,特殊对象属性(RegExp,Date,Error,Symbol,Function)处理,循环引用weekmap处理

    本人是一个web前端开发工程师,主要是vue框架,整理了一些面试题,今后也会一直更新,有好题目的同学欢迎评论区分享 ;-) web面试题专栏:点击此处 在JavaScript中,深拷贝和浅拷贝是两种不同的对象复制方式。 浅拷贝是指将一个对象的引用复制给另一个对象,这意味着两个

    2024年02月07日
    浏览(43)
  • web前端框架JS学习之JavaScript类型转换

    vascript有多种数据类型,如字符串、数字、布尔等,可以通过typeof语句来查看变量的数据类型。数据类型转换就是数据类型之间相互转换,比如把数字转成字符串、把布尔值转成字符串、把字符串转成数字等,这在工作也是经常碰到的。 本期我们就给大家说说web前端框架JS学

    2024年02月10日
    浏览(59)
  • 【前端灵魂脚本语言JavaScript⑤】——JS中数组的使用

    🐚 作者: 阿伟 💂 个人主页: Flyme awei 🐋 希望大家多多支持😘一起进步呀! 💬 文章对你有帮助👉关注✨点赞👍收藏📂 第一种: var 数组名 = new Array(); 创建一个空数组 第二种: var arr2 = new Array(10); 创建一个定长为10的数组 第三种 var arr3 = new Array(a,b,c); 创建时直接指定元素值

    2023年04月08日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包