返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript深拷贝的几种实现方法实例
  • 806
分享到

JavaScript深拷贝的几种实现方法实例

2024-04-02 19:04:59 806人浏览 安东尼
摘要

目录浅拷贝与深拷贝1.JSON.parse(jsON.stringify(obj))2.普通递归函数实现深拷贝3.兼容多种数据类型4.Jquery.extend()方法总结 

浅拷贝与深拷贝

浅拷贝是创建一个新对象,这个对象有着原始对象属性值的拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的是内存地址 。如果不进行深拷贝,其中一个对象改变了对象的值,就会影响到另一个对象的值。

深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。

1.JSON.parse(JSON.stringify(obj))

一般情况下对普通对象需要进行深拷贝,可以使用这种方法进行深拷贝操作,这种是最简单且代码量最少的深拷贝方法。

let a = {a:1,b:2}
let b = JSON.parse(JSON.stringify(a))
a.a = 11
console.log(a)//{a:1,b:2}
console.log(b)//{a:11,b:2}

1.1 JSON.parse(JSON.stringify(obj))深浅拷贝的缺陷

let a = {
    name: 'Jack',
    age: 18,
    hobbit: ['sing', {type: 'sports', value: 'run'}],
    score: {
        math: 'A',
    },
    run: function() {},
    walk: undefined,
    fly: NaN,
    cy: null,
    date: new Date()
}
let b = JSON.parse(JSON.stringify(a))
console.log(b)
// {
//     age: 18,
//     cy: null,
//     date: "2022-05-15T08:04:06.808Z"
//     fly: null,
//     hobbit: (3) ["dance", "sing", {…}],
//     name: "Jack",
//     score: {math: "A"},
// }

取不到值为 undefined 的 key;如果对象里有函数,函数无法被拷贝下来;无法拷贝copyObj对象原型链上的属性和方法;对象转变为 date 字符串

2.普通递归函数实现深拷贝

function deepClone(source) {
  if (typeof source !== 'object' || source == null) {
    return source;
  }
  const target = Array.isArray(source) ? [] : {};
  for (const key in source) {
    if (Object.prototype.hasOwnProperty.call(source, key)) {
      if (typeof source[key] === 'object' && source[key] !== null) {
        target[key] = deepClone(source[key]);
      } else {
        target[key] = source[key];
      }
    }
  }
  return target;
}

2.1解决循环引用和symblo类型

function cloneDeep(source, hash = new WeakMap()) {
  if (typeof source !== 'object' || source === null) {
    return source;
  }
  if (hash.has(source)) {
    return hash.get(source);
  }
  const target = Array.isArray(source) ? [] : {};
  Reflect.ownKeys(source).forEach(key => {
    const val = source[key];
    if (typeof val === 'object' && val != null) {
      target[key] = cloneDeep(val, hash);
    } else {
      target[key] = val;
    }
  })
  return target;
}

3.兼容多种数据类型

const deepClone = (source, cache) => {
  if(!cache){
    cache = new Map() 
  }
  if(source instanceof Object) { // 不考虑跨 iframe
    if(cache.get(source)) { return cache.get(source) }
    let result 
    if(source instanceof Function) {
      if(source.prototype) { // 有 prototype 就是普通函数
        result = function(){ return source.apply(this, arguments) }
      } else {
        result = (...args) => { return source.call(undefined, ...args) }
      }
    } else if(source instanceof Array) {
      result = []
    } else if(source instanceof Date) {
      result = new Date(source - 0)
    } else if(source instanceof RegExp) {
      result = new RegExp(source.source, source.flags)
    } else {
      result = {}
    }
    cache.set(source, result)
    for(let key in source) { 
      if(source.hasOwnProperty(key)){
        result[key] = deepClone(source[key], cache) 
      }
    }
    return result
  } else {
    return source
  }
}

4.jQuery.extend()方法

可以使用$.extend进行深拷贝
$.extend(deepCopy, target, object1, [objectN])//第一个参数为true,就是深拷贝

let a = {
    a: 1,
    b: { d:8},
    c: [1, 2, 3]
};
let b = $.extend(true, {}, a);
console.log(a.b.d === b.b.d); // false

4.1 jQuery.extend 源码

jQuery.extend = jQuery.fn.extend = function() {
  var options,
    name,
    src,
    copy,
    copyIsArray,
    clone,
    target = arguments[0] || {},
    i = 1,
    length = arguments.length,
    deep = false;

  // Handle a deep copy situation
  if (typeof target === "boolean") {
    deep = target;

    // Skip the boolean and the target
    target = arguments[i] || {};
    i++;
  }

  // Handle case when target is a string or something (possible in deep copy)
  if (typeof target !== "object" && !jQuery.isFunction(target)) {
    target = {};
  }

总结 

到此这篇关于javascript深拷贝的文章就介绍到这了,更多相关js深拷贝内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript深拷贝的几种实现方法实例

本文链接: https://lsjlt.com/news/149093.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript深拷贝的几种实现方法实例
    目录浅拷贝与深拷贝1.JSON.parse(JSON.stringify(obj))2.普通递归函数实现深拷贝3.兼容多种数据类型4.jQuery.extend()方法总结 ...
    99+
    2024-04-02
  • JAVA几种方式实现深拷贝
    JAVA几种方式实现深拷贝 准备 定义两个类用于测试拷贝,类内容如下,目的是深拷贝一个User类的对象: @Data@Accessors(chain = true)public class User ...
    99+
    2023-09-05
    Java 拷贝 深拷贝 浅拷贝
  • JS实现深拷贝的几种方法介绍
    引 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。 此篇文章...
    99+
    2024-04-02
  • javascript进阶篇深拷贝实现的四种方式
    目录概念介绍第一种:递归方式(推荐,项目中最安全最常用)第二种:JSON.stringify() ;(这个不推荐使用,有坑)第三种:使用第三方库lodash中的cloneDeep()...
    99+
    2024-04-02
  • javascript深拷贝的几种情况总结
    在前端项目的数据处理中,json数据的拷贝是很常见的,怎么使拷贝的双方数据之间互不影响,这就要用到深拷贝了 深拷贝:引用数据类型中名存在栈内存中,值存在于堆内存中,但是栈内存会提供一...
    99+
    2024-04-02
  • JavaScript中深拷贝与浅拷贝实例运用
    这篇文章主要介绍了JavaScript中深拷贝与浅拷贝实例运用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript中深拷贝与浅拷贝实例运用文章都会有所收获,下面我们一起来看看吧。1 浅拷贝概念深拷...
    99+
    2023-06-29
  • JavaScript浅拷贝与深拷贝如何实现
    这篇文章主要介绍“JavaScript浅拷贝与深拷贝如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript浅拷贝与深拷贝如何实现”文章能帮助大家解决问题。在 JavaScript...
    99+
    2023-06-27
  • JavaScript深拷贝与浅拷贝实现详解
    目录对于基本类型数据对于引用类型数据实现深拷贝简单版够用版structuredClone对于基本类型数据 可以说都是深拷贝。 对于引用类型数据 对于引用类型数据,浅拷贝 后,因为浅拷...
    99+
    2022-11-13
    JavaScript深拷贝与浅拷贝 JS深拷贝与浅拷贝
  • JavaScript如何实现深拷贝
    小编给大家分享一下JavaScript如何实现深拷贝,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!深拷贝递归的完整版本(考虑到了...
    99+
    2024-04-02
  • JavaScript怎么实现深拷贝
    本篇内容主要讲解“JavaScript怎么实现深拷贝”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript怎么实现深拷贝”吧!什么是浅拷贝关于浅拷贝的概念,我在网上看到一种说法,直接...
    99+
    2023-06-27
  • javascript中怎么区分浅拷贝和深拷贝并实现深拷贝
    这篇文章将为大家详细讲解有关javascript中怎么区分浅拷贝和深拷贝并实现深拷贝,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是拷贝 一个东西的拷贝看起来像是原来...
    99+
    2024-04-02
  • javascript深拷贝实现的方式有哪些
    本篇内容主要讲解“javascript深拷贝实现的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript深拷贝实现的方式有哪些”吧!概念介绍深拷贝:在堆内存中重新开辟一个存...
    99+
    2023-07-02
  • Vue浅拷贝和深拷贝实现方案
    目录前言一、数据类型1.1.基本数据类型1.2.引用数据类型1.3.区别二、浅拷贝2.1.定义2.2.浅拷贝特点三、深拷贝3.1.定义3.2.深拷贝特点四、拷贝实现方案4.1.Obj...
    99+
    2023-03-03
    vue深拷贝 vue浅拷贝和深拷贝区别 vue浅拷贝和深拷贝
  • JavaScript中的深拷贝如何实现
    今天小编给大家分享一下JavaScript中的深拷贝如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。深拷贝的最终实现这...
    99+
    2023-07-04
  • vue深拷贝的3种实现方式小结
    目录1、通过递归方式实现深拷贝2、JSON.parse(JSON.stringify(obj))3、jQuery的extend方法实现深拷贝拓展阅读vue深拷贝的其他实现方式总结vu...
    99+
    2023-02-21
    vue深拷贝的三种实现方式 vue实现深拷贝 vue 深拷贝
  • java中关于深拷贝的几种方式
    在java里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。 浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。深拷贝则是拷贝了源对象的所有值,所以即使源对象的值发生变化时,拷贝对象的值也不会改...
    99+
    2023-08-31
    java jvm 开发语言
  • 怎么在JavaScript中实现深拷贝
    怎么在JavaScript中实现深拷贝?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,...
    99+
    2023-06-14
  • JS实现深拷贝和浅拷贝的方式详解
    目录一. 基本类型数据拷贝二. 引用类型数据拷贝1、浅拷贝2、深拷贝说道数据拷贝就离不开数据类型,在JS中数据类型分为基本类型和引用类型 基本类型: number, boolean,...
    99+
    2024-04-02
  • JavaScript中的浅拷贝和深拷贝原理与实现浅析
    目录前言什么是浅拷贝实现浅拷贝什么是深拷贝实现深拷贝前言 JavaScript 中的浅拷贝和深拷贝指的是在复制对象(包括对象、数组等)时,是否只复制对象的引用地址或者在复制时创建一个...
    99+
    2023-05-17
    JavaScript深拷贝与浅拷贝 JS深拷贝与浅拷贝
  • es6实现深拷贝的方法是什么
    ES6实现深拷贝的方法有多种,以下是其中一种常用的方法:1. 使用`JSON.parse()`和`JSON.stringify()`...
    99+
    2023-10-09
    es6
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作