详解JavaScript对象的深浅复制

请参考以下完整攻略。

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实现简单进度条效果,可以通过改变进度条的宽度或者高度来实现。下面是实现的步骤: 步骤1. 创建HTML布局 进度条需要创建一个父容器,然后再创建一个子容器来表示进度。代码如下: <div class="progress-bar"> <div class="progress">…

    JavaScript 2023年6月11日
    00
  • JavaScript中string转换成number介绍

    当需要在JavaScript中使用数字时,需要将字符串转换为数字。在JavaScript中有三种方式可以将字符串转换为数字类型:Number(), parseInt() 和 parseFloat()。下面对这三种方式进行详细介绍。 Number()方法: Number()方法可以把任何JavaScript对象转换为数字。如果对象是一个字符串,字符串只包含数字…

    JavaScript 2023年5月28日
    00
  • JavaScript中好用的解构用法详解

    JavaScript中好用的解构用法详解 什么是解构 在JavaScript中,解构是一种使得能够从数组或者对象中快速提取值、封装成一个变量或变量组的语法。 数组解构 数组的解构就是对数组的值进行“一一对应的提取”操作 基本用法 基本语法如下: let [a, b, c] = [1, 2, 3]; console.log(a); //1 console.lo…

    JavaScript 2023年5月18日
    00
  • JavaScript中直接写undefined的错误及用法剖析

    JavaScript中直接写undefined的错误及用法剖析 在JavaScript中,undefined是一个特殊的值,表示“未定义”的意思。然而,有时候我们会不小心直接写出了undefined,这可能会导致错误。本文将从浅入深地探讨这个问题,并给出一些示例。 常见错误 首先,我们来看看最常见的错误:直接写undefined。 function foo(…

    JavaScript 2023年5月18日
    00
  • JSON+HTML实现国家省市联动选择效果

    下面我将详细讲解“JSON+HTML实现国家省市联动选择效果”的完整攻略,包括以下几个方面: 准备数据 首先,我们需要准备国家省市的数据,放在一个JSON格式的数据文件中。例如,我们可以创建一个名为”china.json”的文件,内容如下: { "country": [ { "name": "中国"…

    JavaScript 2023年5月27日
    00
  • javascript巧用eval函数组装表单输入项为json对象的方法

    下面是详细讲解“javascript巧用eval函数组装表单输入项为json对象的方法”的完整攻略。 简介 在 Web 开发中,我们常常需要将用户在表单中输入的数据组装成 JSON 格式发送给后台进行处理。在传统的方法中,我们需要对每个表单元素逐一获取 value 值并组装成一个 JSON 对象,这种方式虽然可行,但显然效率较低。本文介绍一种巧用 eval …

    JavaScript 2023年5月27日
    00
  • 从0到1学习JavaScript编写贪吃蛇游戏

    从0到1学习JavaScript编写贪吃蛇游戏 前置知识 在学习JavaScript编写贪吃蛇游戏之前,需要掌握以下的前置知识: HTML基础知识:能够使用HTML标签、属性和样式来构建关于游戏的页面结构。 CSS基础知识:掌握CSS盒子模型、选择器、常用的属性和样式,为游戏页面及其组件进行美化布局。 JavaScript基础知识:掌握JavaScript的…

    JavaScript 2023年6月10日
    00
  • Javascript Math log() 方法

    JavaScript中的Math.log()方法是用于计算一个数的自然对数的函数。以下是关于Math.log()方法的完整攻略,包含两个示例。 JavaScript Math对象的log()方法 JavaScript Math对象中的log()方法用于计算一个数的自然对数的函数。下面是log()方法的语法: Math.log(x) 其中,x是一个必需的参数,…

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