千家信息网

在JavaScript 中14个拷贝数组的技巧分别是怎样的

发表于:2024-10-18 作者:千家信息网编辑
千家信息网最后更新 2024年10月18日,在JavaScript 中14个拷贝数组的技巧分别是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。数组拷贝经常被误解,但这并不是因
千家信息网最后更新 2024年10月18日在JavaScript 中14个拷贝数组的技巧分别是怎样的

在JavaScript 中14个拷贝数组的技巧分别是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

数组拷贝经常被误解,但这并不是因为拷贝过程本身,而是因为缺乏对 JS 如何处理数组及其元素的理解。JS 中的数组是可变的,这说明在创建数组之后还可以修改数组的内容。

这意味着要拷贝一个数组,咱们不能简单地将旧数组分配给一个新变量,它也是一个数组。如果这样做,它们将共享相同的引用,并且在更改一个变量之后,另一个变量也将受到更改的影响。这就是我们需要克隆这个数组的原因。

接着来看看一些关于拷贝何克隆数组的有趣方法和技巧。

技巧 1 - 使用Array.slice方法

const numbers = [1, 2, 3, 4, 5]  const copy = numbers.slice() copy.push(6) // 添加新项以证明不会修改原始数组  console.log(copy) console.log(numbers)  // 输出 // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

技巧 2 - 使用Array.map方法

const numbers = [1, 2, 3, 4, 5]  const copy = numbers.map( num => num ) copy.push(6) // 添加新项以证明不会修改原始数组  console.log(copy); console.log(numbers);  // 输出 // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

技巧 3 - 使用Array.from 方法

const numbers = [1, 2, 3, 4, 5];  const copy = Array.from(new Set(numbers)); copy.push(6); // 添加新项以证明不会修改原始数组  console.log(copy); console.log(numbers);  // 输出 // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

技巧 4 - 使用展开操作符

const numbers = [1, 2, 3, 4, 5];  const copy = [...numbers]; copy.push(6); // 添加新项以证明不会修改原始数组  console.log(copy); console.log(numbers);  // 输出  // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

技巧 5 - 使用 Array.of 方法和展开操作符

const numbers = [1, 2, 3, 4, 5];  const copy = Array.of(...numbers); copy.push(6); // 添加新项以证明不会修改原始数组  console.log(copy); console.log(numbers);  // 输出  // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

Array.of() 方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。Array.of() 和 Array 构造函数之间的区别在于处理整数参数:Array.of(7) 创建一个具有单个元素 7 的数组,而 Array(7) 创建一个长度为7的空数组(注意:这是指一个有7个空位(empty)的数组,而不是由7个undefined组成的数组)。

Array.of(7);       // [7]  Array.of(1, 2, 3); // [1, 2, 3]  Array(7);          // [ , , , , , , ] Array(1, 2, 3);    // [1, 2, 3]

技巧 6 - 使用 Array 构造函数和展开操作符

const numbers = [1, 2, 3, 4, 5];  const copy = new Array(...numbers); copy.push(6); // 添加新项以证明不会修改原始数组  console.log(copy); console.log(numbers);  // 输出  // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

技巧 7 - 使用解构

const numbers = [1, 2, 3, 4, 5];  const [...copy] = numbers; copy.push(6); // 添加新项以证明不会修改原始数组  console.log(copy); console.log(numbers);  // 输出 // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

技巧 8 - 使用 Array.concat 方法

const numbers = [1, 2, 3, 4, 5];  const copy = numbers.concat(); copy.push(6); // 添加新项以证明不会修改原始数组  console.log(copy); console.log(numbers);  // 输出 // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

技巧 9 - 使用 Array.push 方法和展开操作符

const numbers = [1, 2, 3, 4, 5];  let copy = []; copy.push(...numbers); copy.push(6); // 添加新项以证明不会修改原始数组  console.log(copy); console.log(numbers);  // 输出 // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

技巧 10 - 使用 Array.unshift 方法和展开操作符

const numbers = [1, 2, 3, 4, 5];  let copy = []; copy.unshift(...numbers); copy.push(6); // 添加新项以证明不会修改原始数组  console.log(copy); console.log(numbers);  // 输出 // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

技巧 11 - 使用 Array.forEach 方法和展开操作符

const numbers = [1, 2, 3, 4, 5];  let copy = []; numbers.forEach((value) => copy.push(value)); copy.push(6); // 添加新项以证明不会修改原始数组  console.log(copy); console.log(numbers);  // 输出 // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

技巧 12 - 使用 for 循环

const numbers = [1, 2, 3, 4, 5];  let copy = []; for (let i = 0; i < numbers.length; i++) {     copy.push(numbers[i]); } copy.push(6); // 添加新项以证明不会修改原始数组  console.log(copy); console.log(numbers);  // 输出 // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

技巧 13 - 使用 Array.reduce 方法

这个做法是可行,但比较多余,少用

const numbers = [1, 2, 3, 4, 5];  const copy = numbers.reduce((acc, x) => { acc.push(x); return acc; }, []); copy.push(6); // 添加新项以证明不会修改原始数组  console.log(copy); console.log(numbers);  // 输出 // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

技巧 14 - 使用古老的 apply 方法

let copy = []; Array.prototype.push.apply(copy, numbers); copy.push(6); // 添加新项以证明不会修改原始数组  console.log(copy); console.log(numbers);  // 输出 // [1, 2, 3, 4, 5, 6] // [1, 2, 3, 4, 5]

代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。

原文:https://twitter.com/protic_milos

总结

请注意,上面这些方法执行的是浅拷贝,就是数组是元素是对象的时候,咱们更改对象的值,另一个也会跟着变,就能技巧4来说,如果咱们的数组元素是对象,如下所示:

const authors = [   { name: '前端小智', age: 25 },    { name: '王大冶', age: 30 },  ]  const copy = [...authors ] copy[0].name = '被更改过的前端小智'  console.log(copy) console.log(authors)

输出

上面的技巧适合简单的数据结构,复杂的结构要使用深拷贝。数组拷贝经常被误解,但这并不是因为拷贝过程本身,而是因为缺乏对 JS 如何处理数组及其元素的理解。

看完上述内容,你们掌握在JavaScript 中14个拷贝数组的技巧分别是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

数组 技巧 方法 输出 原始 拷贝 操作符 元素 内容 参数 变量 对象 函数 前端 原因 就是 数量 更多 结构 而是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 servlet删除数据库 软件开发过程客户的需求 双十一数据库为什么还安全 网络安全需要我们共同守护 计算机软件数据库英文 与华为共享的服务器是哪家 软件开发费计入在建工程 广东pdu服务器电源售价 为什么战意显示无法连接服务器 网络安全泄密离你我有多远 软件开发架构设计书 南宁做软件开发的公司有哪些 计算机软件开发需要许可吗 西湖论剑网络安全保密分论坛 网络安全技术选择题答案 天津智慧养老管理平台软件开发 网络安全征文题目大全 怎么样填充网络安全色 国资企业 网络安全 重要性 海致星图数据库怎么样 servlet删除数据库 花网络安全插画 阿里云服务器可以接几个域名 现代网络技术的坏处 小米电脑怎么激活数据库软件 学计算机数媒和网络技术学院 宝山区数据软件开发采购 数据库导出汉字都是 苹果怎么清空缓存数据库 软件开发问题追溯
0