iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript中的浅拷贝和深拷贝原理与实现浅析
  • 165
分享到

JavaScript中的浅拷贝和深拷贝原理与实现浅析

JavaScript深拷贝与浅拷贝JS深拷贝与浅拷贝 2023-05-17 08:05:11 165人浏览 安东尼
摘要

目录前言什么是浅拷贝实现浅拷贝什么是深拷贝实现深拷贝前言 javascript 中的浅拷贝和深拷贝指的是在复制对象(包括对象、数组等)时,是否只复制对象的引用地址或者在复制时创建一个

前言

javascript 中的浅拷贝和深拷贝指的是在复制对象(包括对象、数组等)时,是否只复制对象的引用地址或者在复制时创建一个新的对象。具体区别如下:

浅拷贝:浅拷贝只拷贝基本类型的数据,而符合类型的数据只复制指向其的指针,而不复制对象本身,新旧对象还是共享同一块内存。这意味着如果原始对象的属性或子对象发生更改,则复制的对象也会受到影响。常见的实现方式包括使用 Object.assign()方法、展开运算符(…)以及循环遍历对象并将其属性复制到新对象中。

深拷贝:深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

什么是浅拷贝

当我们进行 JavaScript 对象或数组的浅拷贝时,它只会复制其基本值的引用,而不是完全复制内容。也就是说,浅拷贝只是复制了原始对象的属性/元素的引用,并没有新建一个对象。

例如,如果我们有一个简单的对象:

const obj = { name: 'John', age: 30 };

然后我们使用对象的赋值语法来创建一个浅拷贝:

const newObj = obj;

此时,newObjobj 都指向同一个内存地址。如果我们改变 newObj 的某个属性,那么 obj 的相应属性也会发生改变。

newObj.age = 40;
console.log(obj.age); // 输出 40

这是因为 newObjobj 指向的是同一个内存地址,所以任何更改都会反映在另一个变量上。

类似地,在数组中进行浅拷贝也会产生相同的效果:

const arr = [1, 2, 3];
const newArr = arr;
newArr.push(4);
console.log(arr); // 输出 [1, 2, 3, 4]

实现浅拷贝

浅拷贝可以使用 Object.assign() 或者展开运算符 … 来实现;


function extend(target, source) {
    for (var key in source) {
        if (source.hasOwnProperty(key)) {
            var value = source[key];
            if (typeof value !== 'undefined') {
                target[key] = value;
            }
        }
    }
    return target;
}

什么是深拷贝

相比于浅拷贝,深拷贝会复制整个对象或数组,包括其所有的嵌套子对象和数组。这意味着新创建的对象与原始对象没有任何关联,改变其中一个对象不会影响另一个。

例如,如果我们使用 JavaScript 的内置函数 JSON.parse()jsON.stringify() 来进行深拷贝:

const obj = { name: 'John', age: 30 };
const newObj = JSON.parse(JSON.stringify(obj));
newObj.age = 40;
console.log(obj.age); // 输出 30

在这个例子中,先使用 JSON.stringify() 将原始对象序列化为字符串,再使用 JSON.parse() 将其解析为新对象。由于字符串是基本类型的值,而非引用类型,因此 newObj 是一个全新的对象,与 obj 没有关系。

类似地,在数组中进行深拷贝也会产生相同的效果:

const arr = [1, [2, 3], [4, [5]]];
const newArr = JSON.parse(JSON.stringify(arr));
newArr[1][0] = 6;
console.log(arr[1][0]); // 输出 2

在这个例子中,通过深拷贝创建了一个新数组,并且修改新数组中嵌套数组的元素时,原始数组并不会受到影响。

实现深拷贝

深拷贝可以使用 JSON.parse(JSON.stringify(obj))、递归复制对象属性、第三方库如 lodash 的 deepClone 等方式来实现。但需注意的是,这些方法也有可能存在一些限制和缺陷,比如不能处理函数、循环引用等问题。

function deepCopy(obj) {
    var result, copy;
    if (obj.constructor === Object)
        result = {}; //判断传入的如果是对象,继续遍历
    else if (Array.isArray(obj))
        result = []; //判断传入的如果是数组,继续遍历
    else
        return obj; //如果是基本数据类型就直接返回
    for (var key in obj) {
        if(obj.hasOwnProperty(key)){
            copy = obj[key];
            if(copy===null){
                break;
            }
            if(typeof copy ==='undefined'){
                result[key]=undefined;
            }else if (getType(copy) == "Object"||getType(copy) == "Array")
                result[key] = deepCopy(copy); //递归方法
            else
                result[key] = copy; //基本数据类型则赋值给属性
        }
    }
    return result;
}

deepCopy(obj, appeard = new Map()) {
    if (!(obj instanceof Object)) return obj; //如果是原始数据类型
    if (appeard.has(obj)) return appeard.get(obj); //如果已经出现过
    let result = Array.isArray(obj) ? [] : {};
    appeard.set(obj, result); //将新对象放入map
    //遍历所有属性进行递归拷贝
    [...Object.keys(obj), ...Object.getOwnPropertySymbols(obj)].forEach(key => (result[key] = this.deepCopy(obj[key], appeard)));
    return result;
}

到此这篇关于JavaScript中的浅拷贝和深拷贝原理与实现浅析的文章就介绍到这了,更多相关Javascript深拷贝与浅拷贝内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript中的浅拷贝和深拷贝原理与实现浅析

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript中的浅拷贝和深拷贝原理与实现浅析
    目录前言什么是浅拷贝实现浅拷贝什么是深拷贝实现深拷贝前言 JavaScript 中的浅拷贝和深拷贝指的是在复制对象(包括对象、数组等)时,是否只复制对象的引用地址或者在复制时创建一个...
    99+
    2023-05-17
    JavaScript深拷贝与浅拷贝 JS深拷贝与浅拷贝
  • 浅拷贝和深拷贝原理分析
    目录前言关于引用关于浅拷贝和深拷贝浅拷贝深拷贝序列化如何选择拷贝方式其他拷贝方式前言 因为它涉及到对象的引用关系,涉及到 Java 是传值还是传递引用关系,这通常是面试的重点。 所以...
    99+
    2024-04-02
  • 分析JavaScript浅拷贝和深拷贝
    本篇内容主要讲解“分析JavaScript浅拷贝和深拷贝”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析JavaScript浅拷贝和深拷贝”吧!一、直接赋值对象是引用类型,如果直接赋值给另外一...
    99+
    2023-06-25
  • 浅谈JavaScript浅拷贝和深拷贝
    目录一、直接赋值二、浅拷贝三、深拷贝1. JSON对象的方式2. 递归复制网上关于这个话题,讨论有很多了,根据各路情况我自己整理了一下,最后还是能接近完美的实现深拷贝,欢迎大家讨论。...
    99+
    2024-04-02
  • JavaScript深拷贝与浅拷贝原理深入探究
    目录一、JS中数据的存储形式-堆栈二、深浅拷贝的三种方式遍历赋值Object.create()遍历赋值实现深拷贝一、JS中数据的存储形式-堆栈 我们先简单理解一下堆栈分别是啥: 什么...
    99+
    2022-11-13
    JS 深拷贝 浅拷贝 JS 深拷贝 JS 浅拷贝
  • JavaScript浅拷贝与深拷贝如何实现
    这篇文章主要介绍“JavaScript浅拷贝与深拷贝如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript浅拷贝与深拷贝如何实现”文章能帮助大家解决问题。在 JavaScript...
    99+
    2023-06-27
  • 浅拷贝与深拷贝
       名词解释 1.对象:被分配的一块内存,存储其所代表的值 2.引用:是自动形成的从变量到对象的指针 3.注意:类型(int类型,long类型(python3已去除long类型,只剩下int类型的数据))属于对象,不是变量 4.不可变...
    99+
    2023-01-30
  • JavaScript深拷贝与浅拷贝实现详解
    目录对于基本类型数据对于引用类型数据实现深拷贝简单版够用版structuredClone对于基本类型数据 可以说都是深拷贝。 对于引用类型数据 对于引用类型数据,浅拷贝 后,因为浅拷...
    99+
    2022-11-13
    JavaScript深拷贝与浅拷贝 JS深拷贝与浅拷贝
  • JavaScript中深拷贝与浅拷贝详解
    目录1 浅拷贝概念2 深拷贝概念3 浅拷贝的实现方式3.1 Object.assign()3.2 Array.prototype.concat()3.3 Array.pro...
    99+
    2024-04-02
  • JavaScript中深拷贝与浅拷贝实例运用
    这篇文章主要介绍了JavaScript中深拷贝与浅拷贝实例运用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript中深拷贝与浅拷贝实例运用文章都会有所收获,下面我们一起来看看吧。1 浅拷贝概念深拷...
    99+
    2023-06-29
  • 如何理解JavaScript中的浅拷贝与深拷贝
    本篇文章给大家分享的是有关如何理解JavaScript中的浅拷贝与深拷贝,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 浅拷贝在使用JavaScript对数组进行操作...
    99+
    2023-06-16
  • javascript中怎么区分浅拷贝和深拷贝并实现深拷贝
    这篇文章将为大家详细讲解有关javascript中怎么区分浅拷贝和深拷贝并实现深拷贝,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是拷贝 一个东西的拷贝看起来像是原来...
    99+
    2024-04-02
  • python深拷贝与浅拷贝
    可变对象与不可变对象 要理解深拷贝和浅拷贝,首先要理解可变对象和不可变对象。 不可变对象:该对象所指向的内存中的值不能被改变,修改对象的值时,由于其指向的值不能被改变,因此实际上是在内存中重新开辟一个地址用来存储新的值,然后将对象指向这个...
    99+
    2023-01-30
    python
  • 怎么理解Javascript深拷贝与浅拷贝
    怎么理解Javascript深拷贝与浅拷贝,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 前言在 javascript &nbs...
    99+
    2024-04-02
  • JavaScript深拷贝与浅拷贝是什么
    这篇文章主要介绍了JavaScript深拷贝与浅拷贝是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1 浅拷贝概念深拷贝和浅拷贝是只针对Object和Array这样的引用...
    99+
    2023-06-29
  • python浅拷贝和深拷贝
    python中的赋值是按引用来传递的,如果不是赋值而是拷贝,那就需要用到copy模块了,这就不得不谈浅拷贝和深拷贝了。   浅拷贝copy()   #!/usr/bin/python  import copy  class MyClass:...
    99+
    2023-01-31
    和深 python
  • python之浅拷贝与深拷贝
    浅拷贝是对于一个对象的顶层拷贝通俗的理解是:拷贝了引用,并没有拷贝内容 In [10]: a = [11,22,33] In [11]: b = a In [12]: id(a) Out[12]: 140343572333832 I...
    99+
    2023-01-31
    python
  • 浅析C++浅拷贝与深拷贝的联系和区别
    文章简述 c++中构造函数分为三类:无参构造、带参构造和拷贝构造,其中拷贝构造可分为默认拷贝(浅拷贝)、深拷贝,在程序中,这里我们主要讲浅拷贝和深拷贝的联系和区别。 首先,我们要明白...
    99+
    2024-04-02
  • Python中的深拷贝浅拷贝
    什么是浅拷贝,什么是深拷贝? 一、浅拷贝 浅拷贝就是:拷贝了引用,并没有拷贝内容,和在Linux中的硬链接有些类似,在python中,使用=赋值的动作就是一个浅拷贝 浅拷贝中的新旧对象,共用一个内存地...
    99+
    2023-09-08
    python 开发语言
  • 老生常谈JavaScript深拷贝与浅拷贝
    目录1 浅拷贝概念2 深拷贝概念3 浅拷贝的实现方式3.1 Object.assign()3.2 Array.prototype.concat()3.3 Array.pro...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作