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 valueOf 方法

    以下是关于JavaScript valueOf方法的完整攻略。 JavaScript valueOf方法 JavaScript valueOf方法是所有JavaScript对象的一个方法,用于返回对象的原始值。对于Number对象,方法返回对象的原数字值。 下面是一个使用valueOf方法的示例: var num = new Number(123); con…

    JavaScript 2023年5月11日
    00
  • 深入理解JavaScript中实例对象和new命令

    深入理解JavaScript中实例对象和new命令 实例对象是什么 在JavaScript中,实例对象指通过构造函数创建出来的对象。每个实例对象都是通过构造函数的 “new” 关键字创建出来的,它们具备同样的属性和方法。 实例对象可以被多次建立,每个实例对象都会有自己独立的属性。每个实例对象都是独一无二的,我们可以通过实例对象来调用它们自己独特的方法和属性。…

    JavaScript 2023年5月27日
    00
  • JavaScript每天必学之数组和对象部分

    JavaScript每天必学之数组和对象部分 一、数组 数组是一种特殊的变量,它可以存储多个数据项,并且这些数据项可以是任意不同的数据类型。在 JavaScript 中,数组属于对象类型,但与其他对象不同的是,它可以通过索引来访问数组中的元素。 1.创建数组 JavaScript 中创建数组有两种方式,一种是使用数组字面量,另一种是通过 Array 构造函数…

    JavaScript 2023年5月27日
    00
  • 微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)

    微信小程序中,为了提高用户体验,往往需要对一些按钮或表单组件进行防止多次点击或输入内容多次验证,以避免用户重复提交数据或误操作。这时,我们可以使用函数防抖来实现这些效果。 函数防抖是指在一段时间内,多次触发同一事件,只执行一次函数。具体而言,是在延迟时间内,如果再次触发了同一事件,则清空之前的计时器并重新开始计时,直到延迟时间过去后再触发该事件时才会执行真正…

    JavaScript 2023年6月10日
    00
  • 基于Jquery实现表单验证

    下面是“基于Jquery实现表单验证”的完整攻略: 一、引入JQuery 我们需要先在HTML页面中引入JQuery,代码如下所示: <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> 二、实现基础…

    JavaScript 2023年6月10日
    00
  • js每隔5分钟执行一次ajax请求的实现方法

    要实现JS每隔5分钟执行一次ajax请求,可以借助JavaScript的定时器(Timer)机制,可以使用setInterval方法来周期性的调用Ajax请求的方法。下面是具体的实现步骤: 在HTML页面上引入jQuery库(或其它ajax库) <script src="https://code.jquery.com/jquery-3.5.1…

    JavaScript 2023年6月11日
    00
  • JavaScript中清空数组的三种方法分享

    下面是详细讲解“JavaScript中清空数组的三种方法分享”的完整攻略。 JavaScript中清空数组的三种方法分享 在JavaScript中,我们经常需要清空一个数组,以便重新填充数据。本文将介绍三种方法来清空一个数组。 方法一:重置数组变量 该方法是最简单的一种方法。只需要将数组变量重新赋值为空数组即可清空该数组。 let arr = [1, 2, …

    JavaScript 2023年5月27日
    00
  • js url传值中文乱码之解决之道

    我会为你详细讲解”js url传值中文乱码之解决之道”的完整攻略。 标准规范 在URL传值的过程中,中文数据因为编码问题可能会引起乱码。解决方法是采用UTF-8编码,使用encodeURIComponent()函数进行编码,使用decodeURIComponent()函数进行解码。 代码示例1: //编码(传值时) var name = "张三&q…

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