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

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日

相关文章

  • layui的表单提交以及验证和修改弹框的实例

    下面我将为你详细讲解“layui的表单提交以及验证和修改弹框的实例”的完整攻略。 什么是layui Layui是一款前端UI框架,致力于提供易用、美观的UI组件以及丰富的应用场景支持。 lay-submit和lay-filter lay-submit: 作用是监听表单提交事件,会阻止默认的表单提交操作。我们可以通过给按钮设置 lay-submit 属性来告诉…

    JavaScript 2023年6月10日
    00
  • 利用策略模式与装饰模式扩展JavaScript表单验证功能

    利用策略模式和装饰模式可以很好地扩展JavaScript表单验证功能。下面就详细讲解如何实现这样的扩展: 策略模式 策略模式定义了一系列可以互换的算法,每个算法都独立封装起来,使得它们之间可以互相替换。利用策略模式,我们可以根据不同的策略选择不同的验证算法。 实现步骤 定义验证算法的接口,即策略类接口。 实现不同的验证策略类,每个类都实现策略类接口。 在表单…

    JavaScript 2023年6月10日
    00
  • JavaScript中for循环的使用详解

    JavaScript中for循环的使用详解 在JavaScript中,循环是一种重要的编程语言结构,for循环是最常用的循环语句之一,可以用来实现对数组、对象、字符串等类型的数据进行遍历,下面我们来详细讲解一下JavaScript中for循环的使用。 基本语法 for循环的基本语法如下: for (初始化表达式; 条件表达式; 递增表达式) { // 循环体…

    JavaScript 2023年5月28日
    00
  • VSCode开发TypeScript的实现步骤

    下面是VSCode开发TypeScript的实现步骤的完整攻略: 步骤一:安装VSCode和TypeScript插件 首先需要安装Visual Studio Code(以下简称VSCode),并在VSCode中安装TypeScript插件。可以在VSCode内部搜索TypeScript插件并安装,也可以在官网下载安装。 步骤二:创建TypeScript项目 …

    JavaScript 2023年6月10日
    00
  • JavaScript 程序编码规范

    当编写 JavaScript 代码的时候,良好的编码规范可以提高代码的可读性、减少错误和加快开发速度。本文将详细讲解 JavaScript 程序编码规范的完整攻略。 格式化 JavaScript 程序编码规范中,始终应该遵守一致的代码格式。在不同编码风格之间切换可能会导致不必要的错误,因此在一个团队中必须制定专属的约定。以下是常用的格式化规范: 缩进 Jav…

    JavaScript 2023年5月19日
    00
  • jQuery使用animate创建动画用法实例

    下面是详细讲解jQuery使用animate创建动画的攻略。 什么是jQuery animate? jQuery animate是一种创建动画的方式,它可以让元素以自然且流畅的方式进行动画效果,比如让元素缓慢地移动、旋转等。 animate()方法的语法 animate()方法的语法如下: jQuery(selector).animate(styles, s…

    JavaScript 2023年6月10日
    00
  • JavaScript如何监测数组的变化

    JavaScript提供了一些方法来监测数组的变化,包括改变数组的方法、监测数组的方法以及对数组进行监听的方法,下面将分别进行详细讲解: 改变数组的方法 JavaScript提供了一些方法用于改变数组,这些方法有可能会改变数组的原始结构,从而影响到程序的正确性。因此,JavaScript也提供了一些-API-来监测数组的变化,以便我们能够及时发现程序中的问题…

    JavaScript 2023年5月27日
    00
  • JS检测浏览器开发者工具是否打开的方法详解

    下面我将详细讲解JS检测浏览器开发者工具是否打开的方法。 一、检测方法 1. 监听 console 字符串输出 开发者工具在控制台中输出字符串时,会触发 console 对象的一些方法,如 console.log()、console.warn()、console.error() 等。我们可以通过监听这些方法的调用来判断开发者工具是否打开: var open …

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