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日

相关文章

  • 微信公众号H5之微信分享常见错误和问题(小结)

    微信公众号H5之微信分享常见错误和问题(小结)攻略 问题一:微信分享异常 在微信公众号H5页面中,经常会出现微信分享异常的问题,具体表现为无法正常分享,或分享后出现无法预览或者预览图不显示等情况。如何解决这类问题呢? 解决方案 1. 确认页面链接的正确性 要保证页面的链接是正确的,即在微信公众号开发平台或微信公众号后台配置的链接一致。 2. 确认分享图片的正…

    JavaScript 2023年5月19日
    00
  • JS动态创建Table,Tr,Td并赋值的具体实现

    下面是“JS动态创建Table,Tr,Td并赋值的具体实现”的攻略。 实现方法 使用JavaScript可以很方便地动态创建表格,具体步骤如下: 创建一个 元素,用于存放动态创建的表格。 使用JavaScript的循环语句,例如for循环或while循环,根据需要动态创建需要的行(tr)和列(td)。 在创建每个行(tr)时,使用循环语句动态创建所需的列(t…

    JavaScript 2023年6月11日
    00
  • js clearInterval()方法的定义和用法

    下面是关于“js clearInterval()方法的定义和用法”的完整攻略: clearInterval()方法的定义和用法 定义 clearInterval()是用于关闭由setInterval()方法设置的定时器的方法,它的语法如下: clearInterval(intervalID) 参数intervalID是通过setInterval()方法返回的…

    JavaScript 2023年6月11日
    00
  • JS访问SWF的函数用法实例

    JS访问SWF函数用法实例攻略 在Web开发中,有时我们需要在JS中调用SWF动画中的函数,来实现一些交互效果。本攻略将详细讲解如何在JS中访问SWF函数,并提供两个实例说明。 步骤一:为SWF函数起一个别名 在AS3中,为了让JS能访问到SWF中的函数,我们需要给这个函数起一个别名。别名可以在发布SWF文件时以“flashvars”参数的形式传递。此处声明…

    JavaScript 2023年5月27日
    00
  • JS实现网络请求的三种方式梳理

    JS实现网络请求的三种方式梳理 在JavaScript开发中,网络请求是不可或缺的一部分,下面是三种常用的实现网络请求的方式: 1. XMLHttpRequest请求 XMLHttpRequest是一个原生JavaScript对象,它是一个浏览器提供的api,用来在浏览器和服务器之间发送HTTP请求和接收服务器数据。XMLHttpRequest请求的基本流程…

    JavaScript 2023年6月11日
    00
  • js替代copy(示例代码)

    JS替代Copy是指使用JavaScript实现复制文本到剪贴板的功能,从而替代传统的复制操作。以下是实现此功能的完整攻略: 1. 导入Clipboard API JavaScript提供了Clipboard API,可以用来读写剪贴板内容。要使用它,需要在代码中导入该API。示例代码如下: import ClipboardJS from ‘clipboar…

    JavaScript 2023年6月11日
    00
  • JavaScript 语句之常用 for 循环详解

    JavaScript 语句之常用 for 循环详解 for 循环是 JavaScript 中最基本的循环结构之一,它可以让我们重复执行一个代码块多次,非常的灵活、简单易懂。在本文中,我们将详细讲解 for 循环的语法、用法以及示例说明。 for 循环的语法 for 循环的语法如下: for (初始化表达式; 条件表达式; 循环后操作表达式) { // 循环代…

    JavaScript 2023年5月28日
    00
  • JavaScript实现一个简易的计算器实例代码

    下面我来为你详细讲解JavaScript实现一个简易的计算器的完整攻略,主要分为以下几步: HTML结构搭建 首先,我们需要在HTML中创建相关的元素,可以通过表格的形式来实现。具体的代码如下: <table> <tr> <td colspan="4"><input type="text…

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