详解JavaScript对象的深浅复制

yizhihongxing

请参考以下完整攻略。

1. JavaScript对象的深浅复制

JavaScript中的对象赋值,涉及到两种复制方法:浅复制和深复制。

浅复制只复制变量对象本身及其属性的引用,针对基本数据类型是深复制,对于复杂数据类型则是浅复制。而深拷贝会完全复制原始对象和嵌套的所有对象,也就是说,新创建的对象与原始对象没有任何关联。

2. 浅复制

浅复制的实现方式有对象的解构赋值、Object.assign()方法和直接使用等三种。

2.1 对象的解构赋值

对象的解构赋值是通过赋值的方式将对象的属性直接取出来。用浅拷贝来打出对象a的属性,并将属性赋到对象b。

let a = {name: 'Jack', age: 20, hobby: ['reading', 'coding']}; 
let b = {...a};
console.log(b === a); //false
a.hobby.push('writing');
console.log(a.hobby); //[ 'reading', 'coding', 'writing' ]
console.log(b.hobby); //[ 'reading', 'coding', 'writing' ]

从上面的代码输出可以看到,改动了a对象,b对象也会受到影响。

2.2 Object.assign()方法

Object.assign() 方法会将所有可枚举属性的值从一个或多个源对象复制到目标对象。它会返回目标对象。

let a = {name: 'Jack', age: 20, hobby: ['reading', 'coding']}; 
let b = Object.assign({}, a);
console.log(b === a); //false
a.hobby.push('writing');
console.log(a.hobby); //[ 'reading', 'coding', 'writing' ]
console.log(b.hobby); //[ 'reading', 'coding', 'writing' ]

通过示例代码可以看到,与使用对象解构方法一样,当我们改动了a对象中的属性时,b对象也会受到影响,因此Object.assign()方法也是一种浅拷贝方法。

2.3 直接复制

直接复制会产生两个具有相同属性的变量,但是它们并不是同一个变量,而且改变其中任意一个的属性,并不会影响另一个变量。

let a = {name: 'Jack', age: 20, hobby: ['reading', 'coding']}; 
let b = a;
console.log(b === a); //true
a.hobby.push('writing');
console.log(a.hobby); //[ 'reading', 'coding', 'writing' ]
console.log(b.hobby); //[ 'reading', 'coding', 'writing' ]

从上面的代码输出可以看到,改动了a对象,b对象也会受到影响,因此直接复制方法也是一种浅拷贝方法。

3. 深复制

深复制的实现方式有JSON.parse(JSON.stringify())、手动递归、第三方库等常见的几种。

3.1 JSON.parse(JSON.stringify())

其中一个最常见的深拷贝对象的方式是使用JSON处理。定义一个JSON序列化再反序列化的过程来复制对象。

let a = {name: 'Jack', age: 20, hobby: ['reading', 'coding']}; 
let b = JSON.parse(JSON.stringify(a));
console.log(b === a); //false
a.hobby.push('writing');
console.log(a.hobby); //[ 'reading', 'coding', 'writing' ]
console.log(b.hobby); //[ 'reading', 'coding' ]

从上面的代码输出可以看到,此时改动了a对象后,b对象并不会受到影响,因此我们成功实现了深拷贝。

需要注意的是,这种深拷贝方式只支持纯JSON可以表示的数据类型,而对于函数、RegExp、Date等这些无法转成JSON对应的数据类型,会被忽略。

3.2 手动递归

手动递归深拷贝对象也是一种常见的方式,具体实现步骤如下:

function deepClone(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }
  let clone = Array.isArray(obj) ? [] : {};
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      clone[key] = deepClone(obj[key]);
    }
  }
  return clone;
}

以上是手动递归深拷贝对象的示例代码。

3.3 第三方库

除了上述两种深拷贝对象的方法,还有一些第三方库也可以完成这些操作,如lodash等,使用起来比较简单。

4. 总结

本文对JavaScript中的对象深浅复制做了详细的讲解,通过示例代码介绍了各种实现方式的特点和使用方法。对于不同的场景和需要,可以选择不同的方式来进行复制,以很好地满足需求并提高开发效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JavaScript对象的深浅复制 - Python技术站

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

相关文章

  • JavaScript实现秒杀时钟倒计时

    JavaScript实现秒杀时钟倒计时的攻略大致包含以下几个步骤: 获取当前时间和秒杀结束时间 计算倒计时的剩余时间 将剩余时间转换为时、分、秒的形式 将倒计时的时、分、秒填充到HTML中 每隔一秒更新倒计时 下面是完整的攻略: 步骤 1. 获取当前时间和秒杀结束时间 在 JavaScript 中,可以通过 new Date() 取得当前的日期和时间,包括年…

    JavaScript 2023年5月27日
    00
  • JavaScript中eval()函数用法详解

    下面就来详细讲解一下”JavaScript中eval()函数用法详解”的完整攻略。 一、eval()函数的基本语法 eval()函数的基本语法如下: eval(string) 其中,参数string是被解析执行的JavaScript代码字符串。 二、eval()函数的用途 eval()函数可以把一个字符串当作JavaScript代码进行解析执行。这在某些场景…

    JavaScript 2023年5月27日
    00
  • js常用函数 不错

    当提到JavaScript编程语言时,函数是其中最重要的一部分。函数可以帮助你简化代码,提高代码的复用性。在JavaScript编程中,有很多种类型的函数,但有些函数是非常常见的,可以被广泛使用。在本文中,我将会介绍几种js常用函数,让你在编写代码时能够更加轻松自如。 1. 时间函数 时间函数在JavaScript开发中有着重要的作用,可以用来创建、解析和操…

    JavaScript 2023年5月27日
    00
  • 使用闭包对setTimeout进行简单封装避免出错

    对于JavaScript定时器setTimeout,常常在一些复杂的场景下使用,但由于其特性,在使用过程中,可能会出现回调函数中的this关键字指向不明的问题,或者定时器句柄无法被清除的问题等。这时,我们可以使用闭包对setTimeout进行简单的封装,以避免出错。下面是具体的攻略: 1. 封装setTimeout 首先,我们要封装setTimeout函数。…

    JavaScript 2023年6月10日
    00
  • js escape,unescape解决中文乱码问题的方法

    对于想要在 URL 参数中包含中文字符的情况,我们必须使用一些特殊的方法进行转义和解码,以确保字符不会在传输过程中被破坏。 一种常见的解决方案是使用 escape 和 unescape 函数进行转义和解码,它们是 JavaScript 中的内置函数,可以直接使用。它们可以将任何字符转义为 %XX 格式,其中 XX 是字符的 ASCII 码的十六进制表示。例如…

    JavaScript 2023年5月19日
    00
  • JavaScript在控件上添加倒计时功能的实现代码

    下面是关于“JavaScript在控件上添加倒计时功能的实现代码”的完整攻略。 1. 实现思路 要在控件上添加倒计时功能,需要实现以下几步: 获取需要显示倒计时的控件对象; 设置倒计时的总时间(例如60秒)和时间间隔(例如每一秒钟); 创建一个计时器,定时更新控件上显示的倒计时时间; 到达倒计时结束时间后,清除计时器。 2. 实现代码示例 以下是两个实现倒计…

    JavaScript 2023年6月11日
    00
  • JavaScript数字和字符串转换示例

    JavaScript 数字和字符串转换是开发过程中非常常见的操作之一。本攻略将带您了解如何在 JavaScript 中进行数字和字符串间的转换。 数字转字符串 在 JavaScript 中可以使用 toString() 方法将数字转换为字符串。 let num = 123; let str = num.toString(); console.log(type…

    JavaScript 2023年5月28日
    00
  • Ajax异步提交表单数据的说明及方法实例

    当使用传统的表单提交方式时,用户提交表单后会跳转到其他页面并加载新的页面内容,这样用户体验较差。而使用Ajax异步提交表单,可以在不刷新页面的情况下提交表单数据,提升用户体验。 实现Ajax异步提交表单数据的步骤如下: 绑定表单的提交事件,阻止默认的表单提交行为。可以使用jQuery的submit方法: $( "#myForm" ).su…

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