js 数组克隆方法 小结

yizhihongxing

以下是关于“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日

相关文章

  • js自执行函数的几种不同写法的比较

    让我们来详细讲解一下“js自执行函数的几种不同写法的比较”。 什么是自执行函数? 自执行函数,也被称为立即执行函数,是指在定义函数后立即调用该函数的一种方式,通常被用来封装一些特定的操作,避免变量污染全局作用域。 自执行函数的几种不同写法 写法一:使用小括号将函数包裹起来 (function () { // code goes here })(); // 或…

    JavaScript 2023年5月27日
    00
  • JavaScript的各种常见函数定义方法

    JavaScript 是当前 Web 开发中最广泛使用的脚本语言之一,其强大的函数定义能力在 Web 开发中也经常被运用。这里我们来介绍几种 JavaScript 常见函数定义方法的完整攻略,帮助大家更好地掌握 JavaScript 函数定义。 函数声明 函数声明是定义 JavaScript 函数的最常见和最基础方式之一。它的语法如下: function f…

    JavaScript 2023年5月27日
    00
  • 原生js仿jquery一些常用方法(必看篇)

    “原生js仿jquery一些常用方法(必看篇)”是一篇文章,介绍了如何使用纯原生的JavaScript实现一些常见的jQuery方法。这些方法包括:选择器、事件绑定、DOM操作、特效等。 以下是这篇文章中介绍的一些内容: 选择器 在jQuery中,我们可以使用美元符号($)来简化选择器的书写。例如: $(“.my-class”) 在原生JavaScript中…

    JavaScript 2023年5月18日
    00
  • 以JSON形式将JS中Array对象数组传至后台的方法

    将JavaScript中的Array对象数组以JSON格式传递至后台的基本步骤包括以下几点: 创建一个Array对象数组 使用JSON.stringify()将Array对象数组转换为JSON格式字符串 使用XMLHttpRequest对象将JSON格式字符串发送到后台 在后台解析JSON字符串并从中提取需要的数据 以下是一个简单的示例代码,演示如何将JS中…

    JavaScript 2023年5月27日
    00
  • 详解JS中统计函数执行次数与执行时间

    首先我们需要明确一下,统计函数执行次数和执行时间是一个常见的需求,它有助于我们优化代码,找到潜在的性能瓶颈,提高应用程序的性能。那么,在JS中如何统计函数执行次数和执行时间呢? 统计函数执行次数 我们可以定义一个计数器来记录函数执行的次数。例如,下面的代码演示了如何统计函数foo的执行次数: let count = 0; function foo() { /…

    JavaScript 2023年5月27日
    00
  • JavaScript函数执行、作用域链以及内存管理详解

    JavaScript函数执行、作用域链以及内存管理详解 在JavaScript中,函数是一等公民,其执行依赖于作用域链和内存管理机制。理解这些概念对于编写高质量的JavaScript代码至关重要。本文将详细介绍JavaScript函数执行、作用域链以及内存管理的相关知识。 函数执行 JavaScript中的函数执行过程分为创建阶段和执行阶段两个阶段。 创建阶…

    JavaScript 2023年5月18日
    00
  • JavaScript进阶(二)词法作用域与作用域链实例分析

    我来为你详细讲解“JavaScript进阶(二)词法作用域与作用域链实例分析”的完整攻略。 什么是词法作用域 词法作用域(Lexical Scope)是指变量在程序中的作用域是由它在代码中声明的位置所决定的。也就是说,变量的作用域在定义时就已经确定了,不会受到函数内部的影响。 词法作用域 vs 动态作用域 JavaScript 采用的是词法作用域,而不是动态…

    JavaScript 2023年5月28日
    00
  • JavaScript函数this指向问题详解

    JavaScript函数this指向问题详解 JavaScript 中的 this 关键字经常让初学者感到困惑或者造成一些常见错误。这篇文章将帮助你全面理解 this 的指向问题以及如何正确使用它。 this 的指向 this 的实际指向是在函数被调用时才能确定的,并且在不同的情况中,其指向也不同。 在全局作用域中 在全局作用域(在任何函数之外)中,this…

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