复制js对象方法(详解)

复制JS对象是很常见的操作,但是需要注意的是,在JS中,对象是引用类型,因此直接复制对象会导致对象引用被复制,而不是对象本身。这里介绍几种复制JS对象的方法,包括深拷贝和浅拷贝。

浅拷贝

浅拷贝可以简单地理解为将对象的属性复制一份到新的对象中,但是属性值为对象的属性仍然是引用关系。

表达式“{...obj}”

ES6中引入了表达式“{...obj}”,可以用于浅拷贝对象。具体方法如下:

const obj = {a: 1, b: {c: 2}};
const newObj = {...obj};
obj.b.c = 3;
console.log(newObj.b.c); // 输出3

示例中,首先创建了一个对象obj,其中包含属性a和一个嵌套的对象b。然后使用表达式“{...obj}”对对象进行浅拷贝,将其复制到新的对象newObj中。最后,修改obj.b.c的值为3,并打印newObj.b.c的值,发现其也变为了3。这是因为在浅拷贝中,属性b的值仍然是原对象中对象b的引用,因此修改原对象中对象b的属性值,会同时影响新对象的属性值。

Object.assign方法

除了使用表达式“{...obj}”进行浅拷贝,还可以使用Object.assign方法进行拷贝。具体方法如下:

const obj = {a: 1, b: {c: 2}};
const newObj = Object.assign({}, obj);
obj.b.c = 3;
console.log(newObj.b.c); // 输出3

示例中,首先创建对象obj,并将其浅拷贝到newObj中,然后修改obj.b.c的值为3,并输出newObj.b.c,发现其也变为了3。由于Object.assign只拷贝对象自身的属性,而不拷贝原型链上的属性和方法,因此可以确保拷贝出的属性是新的对象的自有属性。

深拷贝

深拷贝可以理解为将对象本身以及其属性的值都复制到新的对象中。由于对象的属性可能是对象或数组等引用类型,因此需要使用递归的方式复制对象属性。

JSON.parse(JSON.stringify(obj))

在JS中可以使用JSON.parse(JSON.stringify(obj))进行深拷贝。具体方法如下:

const obj = {a: 1, b: {c: 2}};
const newObj = JSON.parse(JSON.stringify(obj));
obj.b.c = 3;
console.log(newObj.b.c); // 输出2

示例中,首先创建对象obj,并使用JSON.parse(JSON.stringify(obj))进行深拷贝,拷贝结果保存在newObj中。然后修改obj.b.c的值为3,并输出newObj.b.c,发现其仍然是2。这是因为采用JSON.parse(JSON.stringify())进行深拷贝时,会先将对象序列化成JSON格式的字符串,然后再将其解析成新的对象。由于字符串是值类型,因此在解析时会创建新的对象,从而实现了深拷贝。

需要注意的是,采用JSON.parse(JSON.stringify())深拷贝对象时,不能拷贝函数和undefined值。

Lodash's cloneDeep方法

除了JSON.parse(JSON.stringify()),还可以使用Lodash库提供的cloneDeep方法进行深拷贝。具体方法如下:

const _ = require('lodash');
const obj = {a: 1, b: {c: 2}};
const newObj = _.cloneDeep(obj);
obj.b.c = 3;
console.log(newObj.b.c); // 输出2

示例中,首先使用require导入Lodash库,并使用_.cloneDeep()方法进行深拷贝。然后修改原对象obj的属性值,并输出newObj.b.c,发现其仍然是2。lodash的cloneDeep方法可以拷贝对象的所有属性,包括函数和undefined值。

综上所述,深拷贝是将对象及其属性的值都复制到新对象中,而浅拷贝只是复制对象的属性。深拷贝相对比较费时和麻烦,建议仅在必要时使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:复制js对象方法(详解) - Python技术站

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

相关文章

  • 漫谈JS引擎的运行机制 你应该知道什么

    漫谈JS引擎的运行机制 你应该知道什么 什么是JS引擎 JS引擎是指运行JavaScript程序的解释器,它可以解析、执行JavaScript代码,并将其转换成计算机能够理解的语言。目前主流的JS引擎有V8、SpiderMonkey、Chakra等。 JS引擎的运行流程 JS引擎的运行流程通常可以分为以下几个步骤: 词法分析:将JavaScript代码解析成…

    JavaScript 2023年6月10日
    00
  • JS 实现请求调度器

    让我们来详细讲解一下“JS 实现请求调度器”的完整攻略。 什么是请求调度器 请求调度器是一个用于处理并发请求的工具,它主要用于解决并发请求的限制问题。通常,浏览器发送的并发请求数量是有限制的,如果我们需要发送多个请求,会存在发生阻塞的情况。因此,使用请求调度器可以让我们管理并发请求的数量,保证同时只有一定数量的请求被发送,从而更好地管理请求。 实现请求调度器…

    JavaScript 2023年6月11日
    00
  • JavaScript格式化日期时间的方法和自定义格式化函数示例

    JavaScript格式化日期时间的方法和自定义格式化函数示例 在JavaScript中,格式化日期时间是一个常见的需求。本文将介绍在JavaScript中格式化日期时间的方法和自定义格式化函数示例。 提供内置的日期时间格式化方法 在JavaScript中,可以使用Date对象提供的内置方法来格式化日期时间。以下是一些常见的方法及其描述: getFullYe…

    JavaScript 2023年5月27日
    00
  • JS实现在状态栏显示打字效果完整实例

    下面是关于“JS实现在状态栏显示打字效果完整实例”的攻略: 1. 实现思路 在状态栏上显示打字效果,我们需要借助 JS 来动态地修改状态栏文字,并模拟打字效果。 具体实现思路如下: 设置一个状态栏元素,例如 <span> 标签。 通过 JS 动态修改状态栏文本,实现打字效果。 将打字效果分段,通过定时器控制每段文字的出现时间,实现逐个显示效果。 …

    JavaScript 2023年6月11日
    00
  • 如何使用IOS自动化测试工具UIAutomation

    如何使用IOS自动化测试工具UIAutomation攻略 简介 UIAutomation是苹果官方提供的测试工具,可以进行IOS应用的自动化测试。它可以在模拟器或真机上运行,可以创建脚本来模拟用户在应用程序上的操作,然后对这些操作的结果进行验证。 UIAutomation依赖于Javascript语言,并且提供了一些函数来访问IOS应用的UI元素,例如滚动、…

    JavaScript 2023年5月28日
    00
  • 细说JS数组遍历的一些细节及实现

    细说JS数组遍历的一些细节及实现 简介 JavaScript中的数组是一种数据结构,用于存储一组元素。数组常常使用循环来遍历其中的元素,这篇文章将详细讲解JS数组的遍历,以及在遍历过程中需要注意的一些细节。 遍历数组的方法 for循环 for循环是遍历数组最基础、最常用的方法。for循环遍历数组时,可以使用数组的length属性获取数组的长度,通过遍历其下标…

    JavaScript 2023年5月27日
    00
  • Asp.Net中避免重复提交和弹出提示框的实例代码

    在ASP.NET中避免重复提交和弹出提示框是开发Web应用程序时很重要的一部分。下面是一个实例代码,用于防止重复提交表单,并弹出异常提示框。 避免表单重复提交 在ASP.NET中,为了防止表单重复提交,我们可以使用以下两种方式: 1. 禁用页面上提交按钮 在单击按钮时,将其设置为禁用状态。在以前无法恢复之前,可以使其显示Progress GIF图像,以便用户…

    JavaScript 2023年6月11日
    00
  • javascript类型转换示例

    下面我将为你详细讲解“javascript类型转换示例”的完整攻略,包含两个示例说明。 JavaScript类型转换示例 在JavaScript中,类型转换是一个非常重要的概念。在编写JavaScript代码时,我们可能会遇到需要进行类型转换的情况。下面,我将为您介绍两个JavaScript类型转换示例。 示例1: 首先,我们来看一个JavaScript类型…

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