复制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日

相关文章

  • JavaScript代码编写中各种各样的坑和填坑方法

    JavaScript是一门广泛使用的语言,但在编写代码时会遇到各种各样的坑。以下是JavaScript代码编写中的一些常见坑和对应的填坑方法: 坑1:变量作用域问题 JavaScript中的变量作用域是函数级别的,而不是基于代码块的。如果在函数外部声明变量,则变量将成为全局变量,可能会导致变量的混淆和意外赋值。填坑方法是在函数内部使用var、let或cons…

    JavaScript 2023年5月28日
    00
  • CSS对Web页面载入效率的影响分析总结

    CSS对Web页面载入效率的影响分析总结 CSS样式表对Web页面的载入效率有着重要的影响,不合理使用会导致页面的加载速度过慢,影响用户访问体验。因此,优化CSS样式表的使用对Web页面性能优化至关重要。下面将从以下几个方面对CSS对Web页面载入效率的影响进行总结。 CSS文件大小的影响 CSS文件大小是影响Web页面载入效率的主要因素之一。较大的CSS文…

    JavaScript 2023年6月10日
    00
  • js表格排序实例分析(支持int,float,date,string四种数据类型)

    以下是“js表格排序实例分析”的完整攻略: 简介 在网页开发中,表格是非常常见的元素,而在这些表格中为了用户的方便,我们可能需要给表格加上排序功能。这篇文章将介绍如何使用JS实现一个表格排序的功能。针对表格中不同的数据类型(int,float,date和string),我们将分别实现排序功能。 准备工作 在实现排序功能之前,我们需要做一些准备工作。 添加表格…

    JavaScript 2023年6月10日
    00
  • JS对象与json字符串相互转换实现方法示例

    下面是JS对象与JSON字符串相互转换的完整攻略。 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是由Douglas Crockford提出的。JSON采用了类似于JavaScript对象的格式来存储和传递数据,因此JSON在JavaScript程序中得到了广泛使用。 JS对象与JSON字符串…

    JavaScript 2023年5月27日
    00
  • 详解JS HTML Web端使用MQTT通讯测试

    下面是“详解JS HTML Web端使用MQTT通讯测试”的完整攻略: 一、MQTT介绍 即消息队列遥测传输(Message Queue Telemetry Transport,缩写为MQTT)是一个开放的物联网协议,由IBM于1999年开发。它是一个非常轻量的通讯协议,适合于各种网络连接条件下的物联网设备之间的消息通讯。同时,MQTT协议可以和HTTP和W…

    JavaScript 2023年5月27日
    00
  • 超详细教程实现Vue底部导航栏TabBar

    接下来我会详细讲解实现Vue底部导航栏TabBar的完整攻略。 简介 Vue底部导航栏TabBar,在很多移动端应用或者网站中都是常用的布局,因此在Vue中实现这样的底部导航栏也是很常见的需求。本篇文章将详细介绍如何使用Vue实现底部TabBar并进行相应的样式控制。 实现步骤 安装 vue-router 命令:npm install vue-router …

    JavaScript 2023年6月11日
    00
  • 正则表达式创建方式的区别及编写简单的正则方式(js学习总结)

    让我来详细讲解一下“正则表达式创建方式的区别及编写简单的正则方式”的攻略。 区别 首先,我们需要了解正则表达式创建方式的区别。常见的正则表达式创建方式有以下三种: 字面量方式:使用斜杠(/)将正则表达式包裹起来,例如:/abc/ 构造函数方式:使用new RegExp()构造函数来创建正则表达式对象,例如:new RegExp(‘abc’) 工厂函数方式:使…

    JavaScript 2023年6月10日
    00
  • 7个Python中的隐藏小技巧分享

    下面是“7个Python中的隐藏小技巧分享”的完整攻略: 1. 列表推导式 在Python中,使用列表推导式可以轻松地生成一个列表,从而简化代码。 示例代码如下: # 生成列表中的平方值 squares = [i**2 for i in range(10)] print(squares) 输出结果如下: [0, 1, 4, 9, 16, 25, 36, 49…

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