js 数组克隆方法 小结

以下是关于“js 数组克隆方法 小结”的完整攻略:

标准的数组克隆方式

在JavaScript中,有两种标准的数组克隆方式:

  1. 利用ES6的扩展运算符(...)
const arr1 = [1, 2, 3];
const arr2 = [...arr1];

console.log(arr1); // [1, 2, 3]
console.log(arr2); // [1, 2, 3]

// 修改原数组
arr1.push(4);
console.log(arr1); // [1, 2, 3, 4]
console.log(arr2); // [1, 2, 3]

该方法使用扩展运算符(...),可以非常简单地将一个数组克隆到另一个数组中。由于扩展运算符是浅拷贝,只能复制数组的一层,如果数组中还有对象嵌套的情况就需要其他方式来克隆。

  1. 利用Array.from方法
const arr1 = [1, 2, 3];
const arr2 = Array.from(arr1);

console.log(arr1); // [1, 2, 3]
console.log(arr2); // [1, 2, 3]

// 修改原数组
arr1.push(4);
console.log(arr1); // [1, 2, 3, 4]
console.log(arr2); // [1, 2, 3]

该方法利用Array.from方法,将一个类数组对象或可迭代对象转换成一个真正的数组。由于该方法也只能复制数组的一层,所以复杂的数据结构不适用于该方法。

深克隆

如果一个数组嵌套了其他对象或数组,那么上述方法是无法实现深克隆的。在这种情况下,可以使用一些其他方法:

  1. 递归

最常见的做法是采用递归,遍历原数组的每一个元素,如果是数组或对象则递归调用克隆方法来处理子元素:

function cloneArrayDeeply(arr) {
  let clone = [];
  for(let i = 0; i < arr.length; i++) {
    clone[i] = typeof arr[i] === 'object' ? cloneArrayDeeply(arr[i]) : arr[i];
  }
  return clone;
}

const arr1 = [[1, 2], [3, 4], {name: '张三'}];
const arr2 = cloneArrayDeeply(arr1);

// 修改原数组嵌套的对象
arr1[2].name = '李四';
console.log(arr1); // [[1, 2], [3, 4], {name: '李四'}]
console.log(arr2); // [[1, 2], [3, 4], {name: '张三'}]
  1. JSON序列化反序列化

将原数组转换为JSON字符串,再将字符串解析为新数组,这也可以达到深克隆的目的:

function cloneArrayDeeply(arr) {
  return JSON.parse(JSON.stringify(arr));
}

const arr1 = [[1, 2], [3, 4], {name: '张三'}];
const arr2 = cloneArrayDeeply(arr1);

// 修改原数组嵌套的对象
arr1[2].name = '李四';
console.log(arr1); // [[1, 2], [3, 4], {name: '李四'}]
console.log(arr2); // [[1, 2], [3, 4], {name: '张三'}]

需要注意的是,该方法虽然可以克隆深层嵌套的数组和对象,但也有一些缺陷,如无法序列化undefined、函数、Symbol等类型,以及无法处理循环引用的情况。

示例说明

以下是两个示例说明:

  1. 针对第一种克隆方式的示例
const arr1 = [1, [2, 3], {name: '张三'}];
const arr2 = [...arr1];

console.log(arr1); // [1, [2, 3], {name: '张三'}]
console.log(arr2); // [1, [2, 3], {name: '张三'}]

// 修改原数组嵌套的对象
arr1[2].name = '李四';
console.log(arr1); // [1, [2, 3], {name: '李四'}]
console.log(arr2); // [1, [2, 3], {name: '李四'}]

在这个示例中,我们使用扩展运算符(...)将数组arr1克隆到数组arr2中,并且修改原数组中嵌套的对象。可以看到,两个数组都发生了变化。

  1. 针对深层嵌套数组的示例
const arr1 = [1, [2, 3], {name: '张三'}];
const arr2 = cloneArrayDeeply(arr1);

console.log(arr1); // [1, [2, 3], {name: '张三'}]
console.log(arr2); // [1, [2, 3], {name: '张三'}]

// 修改原数组嵌套的对象
arr1[2].name = '李四';
console.log(arr1); // [1, [2, 3], {name: '李四'}]
console.log(arr2); // [1, [2, 3], {name: '张三'}]

在该示例中,我们使用递归的方式实现了数组的深克隆,并且修改了原数组中嵌套的对象。可以看到,只有原数组发生了变化,新数组依旧保持不变。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js 数组克隆方法 小结 - Python技术站

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

相关文章

  • 利用JavaScript实现简单的网页时钟

    实现网页时钟的攻略如下: 1.准备工作 首先,在HTML文档中添加一个用于显示时间的<div>元素。 <div id="clock"></div> 接下来,为CSS样式设置一个类,用于设置字体大小、颜色、样式和对齐方式。 .clock { font-size: 48px; color: #333; fo…

    JavaScript 2023年5月28日
    00
  • 能够让你事半功倍的JS utils工具函数详解

    能够让你事半功倍的JS utils工具函数详解 在前端开发中,我们经常会使用许多工具函数来帮助我们简化代码、提高效率。JS Utils工具函数是一种高效的解决方案,可以让我们在编写代码时事半功倍。下面我将详细讲解JS Utils工具函数的使用方法。 引入JS Utils工具函数 要使用JS Utils工具函数,首先需要在页面中引入对应的JS文件。例如,我们可…

    JavaScript 2023年6月10日
    00
  • javascript使用for循环批量注册的事件不能正确获取索引值的解决方法

    当使用 for 循环批量注册事件时,经常会遇到无法正确捕获循环变量 i 的问题。这是因为循环结束后,i 的值会变成循环内最后一个迭代的值。这个问题通常称为 JavaScript 的闭包问题。下面是一个简单的示例说明: <!DOCTYPE html> <html> <head> <title>for循环注册事件示…

    JavaScript 2023年6月10日
    00
  • 详解JS数据类型的值拷贝函数(深拷贝)

    以下是详解JS数据类型的值拷贝函数(深拷贝)的攻略: 什么是深拷贝 在 JS 中,我们把变量分为两类:基础类型和引用类型。基本类型的值直接存储在栈(stack)中,而引用类型的值存储在堆(heap)中,变量实际上是一个指针指向对应的地址。因此,基础类型变量的修改不影响其他变量,而引用类型变量的修改会影响所有指向同一地址的变量。而深拷贝就是将原始数据类型和引用…

    JavaScript 2023年6月10日
    00
  • javascript dom 操作详解 js加强

    Javascript DOM 操作详解 简介 DOM(Document Object Model),即文档对象模型,是指HTML或XML文件的一个存储模型。使用DOM,我们可以通过Javascript来操作网页上的内容和结构,实现动态效果。本文旨在介绍Javascript DOM的相关知识,包括节点遍历、元素获取、属性操作、样式操作、事件绑定等内容。 节点遍…

    JavaScript 2023年5月27日
    00
  • js Array对象的扩展函数代码

    我来给你讲解一下关于”js Array对象的扩展函数代码”的完整攻略。 1. 什么是数组(Array)对象 在JavaScript中,数组(Array)是一个数字索引的对象集合,可以高效地存储一组数据。数组对象是指定大小的、有序的对象,它们可以存储各种类型的数据,包括数字、字符串、布尔值,甚至其他数组和对象。 2. 数组对象的扩展函数代码 下面是几个使用数组…

    JavaScript 2023年5月27日
    00
  • Javascript Math min() 方法

    JavaScript中的Math.min()方法是用于返回一组数中的最小值的函数。以下是关于Math.min()方法的完整攻略,包含两个示例。 JavaScript Math对象的min()方法 JavaScript Math的min()方法用于返回一数中的最小。下面是min()方法的语法: Math.min([value1[,2 …]]]) 其中,va…

    JavaScript 2023年5月11日
    00
  • ajax jquery 异步表单验证示例代码

    当用户在网站上提交表单时,通常不希望页面重新加载或刷新。通过使用AJAX和jQuery,可以实现异步表单验证。具体攻略如下: 第一步:添加jQuery库 在页面中先添加jQuery库,确保其正常工作。可以从以下链接下载并将其添加到页面中。 <script src="https://code.jquery.com/jquery-3.5.1.mi…

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