JS对象复制(深拷贝和浅拷贝)

yizhihongxing

JS对象复制主要分为两种,浅拷贝和深拷贝。浅拷贝只复制原始对象的引用,而深拷贝则是将整个对象复制一份,两者在实际应用场景中均有各自的优势和劣势。

浅拷贝

浅拷贝并不复制对象本身,而是复制对象的引用,因此两个变量指向的是同一个对象,当对象发生改变时,另一个变量也会跟着变化。浅拷贝通常使用Object.assign,Array.slice或展开符等操作。

以Object.assign为例,以下代码复制了对象obj的引用,并创建了一个新对象newObj:

let obj = {a:{b:1}};
let newObj = Object.assign({}, obj); // {a: {b: 1}}

由于复制的只是对象的引用,所以对原始对象进行改变会影响到新对象:

obj.a.b = 2;
console.log(newObj); // {a: {b: 2}}

深拷贝

深拷贝是将原始对象的每一层属性复制一份,生成一个新的对象。这种操作最安全,最不容易出错,但同时也是最耗费性能的。深拷贝可以使用JSON.parse(JSON.stringify(object))或递归函数进行实现。

以下是使用递归函数进行深拷贝的代码:

function deepClone(obj) {
    if(typeof obj !== 'object' || obj === null) {
        return obj;
    }
    let newObj = Array.isArray(obj) ? [] : {};
    for(let key in obj) {
        newObj[key] = deepClone(obj[key]);
    }
    return newObj;
}

let obj = {a:{b:1}};
let newObj = deepClone(obj); // {a: {b: 1}}

obj.a.b = 2;
console.log(newObj); // {a: {b: 1}}

上述代码中,定义了一个递归函数deepClone,对于传入的参数obj,首先进行类型判断,如果obj不是对象或为null,则直接返回obj,否则使用一个新的对象newObj存储拷贝后的结果,遍历obj的属性,对每个属性进行递归调用并将结果赋值给newObj的相应属性,最后返回newObj。

无论选择哪种复制方式,应当谨慎选择对于当前需求而言最适合的方案进行使用,以避免出现意外的错误。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS对象复制(深拷贝和浅拷贝) - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • javascript与css3动画结合使用小结

    为了让大家更好地理解“javascript与css3动画结合使用小结”,我将详细阐述攻略的步骤和示例说明。 攻略步骤 步骤1:制定动画效果计划 在使用JavaScript和CSS3组合制作动画效果之前,您需要先确认您所需要的动画效果,比如运动的方向、速度、倍率等等。 步骤2:编写CSS3动画样式 接下来,根据您计划好的动画效果,您需要编写相应的CSS3动画样…

    JavaScript 2023年6月10日
    00
  • 详解JS函数重载

    下面我将为大家详细讲解关于JavaScript函数重载的完整攻略。 什么是JS函数重载 在JavaScript中,函数重载是指在同一个范围内定义多个同名但参数类型或数量不同的函数,根据函数的参数类型或数量来判断执行哪一个具体的函数。 使用方法 在JavaScript中,没有像Java或C++语言那样支持函数重载的语法。但是我们可以通过一些技巧来实现函数重载。…

    JavaScript 2023年5月28日
    00
  • JavaScript 实现生命游戏

    JavaScript 实现生命游戏攻略 生命游戏是一个经典的细胞自动机,它是由英国数学家约翰·何顿·康威于1970年发明的。该游戏规则虽然简单,但是可玩性极高,主要涉及到生死、繁衍和群体规律等内容。 本文主要介绍了如何使用 JavaScript 实现生命游戏,分别从实现规则和游戏界面两个方面进行阐述。 实现规则 生命游戏的规则和初始状态都是在网格上的,它主要…

    JavaScript 2023年5月28日
    00
  • JavaScript导出Excel实例详解

    JavaScript导出Excel实例详解 在Web开发中经常需要导出一些数据,Excel是一个广泛使用的表格处理工具,而JavaScript则是Web开发中不可缺少的脚本语言,因此JavaScript导出Excel成为了Web开发中一个常见的需求。在本篇文章中,我们将详细讲解如何使用JavaScript导出Excel数据。 原生JavaScript实现Ex…

    JavaScript 2023年6月11日
    00
  • JSONP跨域的原理解析及其实现介绍

    下面我将详细讲解“JSONP跨域的原理解析及其实现介绍”的完整攻略。 什么是JSONP跨域 首先,需要了解JSONP(JSON with Padding)是什么。在网络应用中,由于安全策略的限制,浏览器不能直接跨域获取数据。JSONP利用“script”标签不受跨域限制的特性,通过动态创建“script”标签,并在服务器返回的数据中添加一个回调函数,从而实现…

    JavaScript 2023年5月27日
    00
  • JavaScript jquery及AJAX小结

    JavaScript jQuery及 AJAX小结 在对于 JavaScript、jQuery 和 AJAX 进行学习和使用时,可以以下这些知识点为核心来掌握。 JavaScript 基础语法 JavaScript 可以定义变量,条件语句(if…else…)、循环语句(for、while)、函数、对象等。 下面是定义一个变量并在控制台输出的示例代码:…

    JavaScript 2023年5月18日
    00
  • Vue实现调用PC端摄像头实时拍照

    下面我来详细讲解一下Vue实现调用PC端摄像头实时拍照的完整攻略。 1. 获取用户的设备权限和相机设备 在Vue中将调用PC端摄像头分为两步,首先是获取用户的设备权限和相机设备。 //获取用户媒体设备(摄像头) if (navigator.mediaDevices.getUserMedia) { navigator.mediaDevices.getUserM…

    JavaScript 2023年6月11日
    00
  • 全面解析JavaScript中的valueOf与toString方法(推荐)

    全面解析JavaScript中的valueOf与toString方法 本文将全面深入地解析JavaScript中的valueOf与toString方法,以及它们的区别和各自的应用场景。 前言 JavaScript是动态的、弱类型的语言,它允许我们对不同类型的值进行各种操作。由于JavaScript的数据类型是动态的,因此只有在执行代码时才能确定变量的数据类型…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部