javascript二维数组和对象的深拷贝与浅拷贝实例分析

yizhihongxing

JavaScript二维数组和对象的深拷贝与浅拷贝实例分析

概述

在JavaScript中,数组和对象是两个广泛使用的数据结构,它们在实际开发中经常需要进行拷贝操作。拷贝操作没有统一的标准,被分为深拷贝和浅拷贝两种类型。当数组或对象中的元素比较简单时,使用浅拷贝已经能满足需求。但若数组或对象中存在嵌套的元素,使用浅拷贝时会出现意想不到的结果。此时需要使用深拷贝来保证数据的正确性。

在本篇攻略中,我们将讨论JavaScript中二维数组和对象的深拷贝与浅拷贝的实现方式以及应用场景。

浅拷贝

JavaScript中浅拷贝是指拷贝对象或数组的第一层数据,而保留对象或数组中的引用。当源对象或源数组改变时,拷贝后的对象或数组也会随之改变。

我们可以使用for循环或Object.assign()来实现浅拷贝。以下是两个示例:

使用for循环实现浅拷贝

const sourceArr = [1, 2, 3, [4, 5]];
const copyArr = [];

for (let i = 0; i < sourceArr.length; i++) {
  copyArr[i] = sourceArr[i];
}

sourceArr[0] = 100;
console.log(copyArr); // [1, 2, 3, [4, 5]]

使用Object.assign()实现浅拷贝

const sourceObj = {
  name: 'Alice',
  age: 20,
  address: {
    city: 'Beijing',
    street: 'Xizhimen'
  }
};
const copyObj = Object.assign({}, sourceObj);

sourceObj.name = 'Bob';
sourceObj.address.city = 'Shanghai';
console.log(copyObj); // {name: 'Alice', age: 20, address: {city: 'Shanghai', street: 'Xizhimen'}}

深拷贝

JavaScript中深拷贝是指拷贝所有层的数据,不保留原始对象或数组的引用。深拷贝后的对象或数组与原始对象或数组是完全独立的,不会互相影响。

我们可以使用递归函数或JSON.parse(JSON.stringify())来实现深拷贝。以下也是两个示例:

使用递归函数实现深拷贝

const sourceArr = [1, 2, 3, [4, 5]];
const deepCopyArr = [];

function deepCopy(source, copy) {
  for (let i = 0; i < source.length; i++) {
    if (source[i] instanceof Array) {
      copy[i] = [];
      deepCopy(source[i], copy[i]);
    } else {
      copy[i] = source[i];
    }
  }
}

deepCopy(sourceArr, deepCopyArr);

sourceArr[0] = 100;
sourceArr[3][0] = 400;
console.log(deepCopyArr); // [1, 2, 3, [4, 5]]

使用 JSON.parse(JSON.stringify()) 实现深拷贝

这种方式需要使用JSON对象对JavaScript数据进行序列化和反序列化。因此,如果被拷贝的对象或数组包含函数、RegExp等JavaScript类型时,将会失效。

const sourceObj = {
  name: 'Alice',
  age: 20,
  address: {
    city: 'Beijing',
    street: 'Xizhimen'
  }
};
const deepCopyObj = JSON.parse(JSON.stringify(sourceObj));

sourceObj.name = 'Bob';
sourceObj.address.city = 'Shanghai';
console.log(deepCopyObj); // {name: 'Alice', age: 20, address: {city: 'Beijing', street: 'Xizhimen'}}

总结

浅拷贝和深拷贝都有各自适用的场景。在处理简单数据结构时,使用浅拷贝能够节省内存空间和时间。但当需要处理复杂数据结构时,深拷贝更能够保证数据的正确性。

另外,实现深拷贝的递归函数和JSON.parse(JSON.stringify())都有缺点。前者需要自行处理循环引用等问题,后者无法拷贝函数和RegExp等JavaScript类型。因此,开发者在使用深拷贝时需要根据实际情况进行选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript二维数组和对象的深拷贝与浅拷贝实例分析 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 基于JavaScript实现单例模式

    让我来详细讲解一下“基于JavaScript实现单例模式”的完整攻略。 什么是单例模式? 单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。在JavaScript中,由于它是一种动态语言,所以没有像Java、C++等静态语言那样的固有的单例模式实现方式,但是我们可以用JavaScript的一些语言特性来模拟出单例模式。 单…

    JavaScript 2023年6月10日
    00
  • JavaScript事件委托

    JavaScript 事件委托是一种常用的编程技巧,它可以避免为每个元素添加事件监听器。事件委托背后的思想是,将事件监听器添加到其父元素上,而不是为每个子元素添加监听器。当事件触发时,事件将从子元素冒泡到其父元素,由父元素的事件监听器处理。这种技巧可以减少代码量,提高性能。 以下是一个完整的 JavaScript 事件委托攻略: 1. 理解事件冒泡和捕获 事…

    Web开发基础 2023年3月30日
    00
  • 教你用typescript类型来推算斐波那契

    下面是教你用 TypeScript 类型来推算斐波那契的完整攻略。 一、斐波那契数列的定义 斐波那契数列是指这样一个数列:0、1、1、2、3、5、8、13、21、34、……我们定义 f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)(n>=2,n∈N*)。 二、使用 TypeScript 声明斐波那契数列类型 我们可以使用 TypeScr…

    JavaScript 2023年5月28日
    00
  • json数据格式常见操作示例

    非常感谢您的关注,下面是关于“json数据格式常见操作示例”的完整攻略。 什么是JSON? JSON(JavaScript Object Notation)是一个轻量级的数据交换格式,它基于JavaScript的一个子集。与XML相比,它更加简洁、易于阅读和编写,而且占用带宽小。因此现在很多Web服务都采用JSON格式来进行数据交互。 JSON常见操作示例 …

    JavaScript 2023年5月27日
    00
  • vue路由实现登录拦截

    vue路由实现登录拦截是常见的前端开发技巧之一,有利于确保用户访问权限的安全性。下面我将为大家介绍如何利用vue路由实现登录拦截。具体步骤如下: 1. 使用vue-router实现路由拦截 在Vue Router中,可以通过导航钩子函数实现路由拦截,拦截器可以在跳转之前或之后执行一些操作,例如更改路由,验证用户权限等。 前置守卫(beforeEach) 在跳…

    JavaScript 2023年6月11日
    00
  • 使用JavaScript触发过渡效果的方法

    下面是使用JavaScript触发过渡效果的方法的完整攻略。 什么是CSS过渡效果 在介绍如何使用JavaScript触发过渡效果之前,先来简单介绍一下什么是CSS过渡效果。CSS过渡效果(CSS Transitions)是一种可以让元素在某个CSS属性发生变化的时候,产生平滑的动效的方法。 比如我们可以通过如下代码来让一个元素当宽度发生变化时,平滑地变宽:…

    JavaScript 2023年6月10日
    00
  • 一篇文章教你写出干净的JavaScript代码

    以下是“一篇文章教你写出干净的JavaScript代码”的完整攻略: 1. 注重代码风格的统一性 在写JavaScript代码时,我们要注重代码风格的统一性。一个好的规范在团队协作时非常重要,可以提高代码的可维护性和可读性,避免出现一些低级错误。我们可以采用一些代码风格规范化的工具,比如ESLint和Prettier等。 2. 避免全局变量的滥用 在Java…

    JavaScript 2023年6月1日
    00
  • Javascript学习笔记之数组的遍历和 length 属性

    Javascript学习笔记之数组的遍历和 length 属性 介绍 在 Javascript 中,数组是一种常见的数据结构。数组是一组按顺序排列的值的集合,每个值都可以通过一个索引进行访问。数组可以存储各种类型的值,包括数字、字符串、对象和函数等。 数组的 length 属性用于获取数组的长度,即其中元素的数量。 在本文中,我将介绍如何遍历数组以及如何使用…

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