当前位置: 首页 > news >正文

Array.from()方法解析与应用

Array.from() 是 JavaScript 中一个非常实用的静态方法,用于将类数组对象(array-like objects)或可迭代对象(iterable objects)转换为一个新的数组实例。

核心功能解析:

  1. 转换对象类型:
    • 类数组对象 (Array-like Objects): 拥有 length 属性,并且可以通过数字索引访问元素的对象(如 arguments, NodeList, HTMLCollection, { 0: ‘a’, 1: ‘b’, length: 2 })。
    • 可迭代对象 (Iterable Objects): 实现了 [Symbol.iterator] 方法的对象(如 String, Set, Map, TypedArray, 自定义迭代器对象)。
  2. 语法:
Array.from(arrayLikeOrIterable[, mapFn[, thisArg]])
  • arrayLikeOrIterable:必需。要转换为数组的类数组对象或可迭代对象。
  • mapFn:可选。一个映射函数,新数组的每个元素都会执行该函数。作用类似于 Array.prototype.map()。
  • thisArg:可选。执行 mapFn 函数时使用的 this 值。
  1. 返回值: 一个新的数组实例。

关键特点:

  • 浅拷贝 (Shallow Copy): 如果被转换的对象包含对象引用,新数组包含的是对这些相同对象的引用(不是深拷贝)。
  • 处理稀疏数组: 对于类数组对象中缺失的索引(例如 { length: 3 }),Array.from() 会创建稀疏数组(对应位置为 undefined)。
  • 映射功能: 第二个参数 mapFn 允许在创建数组的同时对每个元素进行转换,避免了先调用 Array.from() 再调用 map() 的额外开销。
  • this 绑定: 第三个参数 thisArg 允许在 mapFn 中指定 this 上下文。

常见应用场景:

  1. 字符串转字符数组:
const str = "hello";
const charArray = Array.from(str);
console.log(charArray); // ['h', 'e', 'l', 'l', 'o']
  1. NodeList / HTMLCollection 转数组 (DOM 操作):
    这是最常见的应用之一,因为 querySelectorAll 等方法返回 NodeList,它没有数组的许多方法(如 map, filter, reduce)。
const divs = document.querySelectorAll('div'); // NodeList
const divArray = Array.from(divs); // 转换为真正的数组// 现在可以使用数组方法
divArray.forEach(div => console.log(div));
divArray.filter(div => div.classList.contains('active'));
  1. arguments 对象转数组:
    在函数内部,arguments 是一个类数组对象。
function sum() {// 旧方法: Array.prototype.slice.call(arguments)const argsArray = Array.from(arguments);return argsArray.reduce((acc, curr) => acc + curr, 0);
}
console.log(sum(1, 2, 3)); // 6

注意:现代 JavaScript 更推荐使用剩余参数(…args)替代 arguments。

  1. Set 或 Map 的键/值转数组:
    Set 和 Map 都是可迭代对象。
const mySet = new Set([1, 2, 2, 3]); // Set(3) {1, 2, 3}
const setArray = Array.from(mySet);
console.log(setArray); // [1, 2, 3] (去重)const myMap = new Map([['a', 1],['b', 2]
]);
const keysArray = Array.from(myMap.keys()); // ['a', 'b']
const valuesArray = Array.from(myMap.values()); // [1, 2]
const entriesArray = Array.from(myMap); // [['a', 1], ['b', 2]]
  1. 生成数字序列:
    利用 { length: N } 这个类数组对象和 mapFn。
// 生成 [0, 1, 2, 3, 4]
const sequence1 = Array.from({ length: 5 }, (_, index) => index);
console.log(sequence1); // [0, 1, 2, 3, 4]// 生成 [1, 2, 3, 4, 5]
const sequence2 = Array.from({ length: 5 }, (_, index) => index + 1);
console.log(sequence2); // [1, 2, 3, 4, 5]// 生成 [2, 4, 6, 8, 10]
const doubles = Array.from({ length: 5 }, (_, index) => (index + 1) * 2);
console.log(doubles); // [2, 4, 6, 8, 10]

这比传统的 for 循环或 Array(n).fill().map() 更简洁。

  1. 处理具有非标准键名的类数组对象:
    只要对象有 length 属性和按数字索引访问元素的能力。
const arrayLike = {'0': 'zero','1': 'one','2': 'two','name': 'My Array-Like', // 非数字属性会被忽略length: 3
};
const realArray = Array.from(arrayLike);
console.log(realArray); // ['zero', 'one', 'two']

注意事项:

  1. 兼容性: Array.from() 是 ES6 (ES2015) 引入的方法。现代浏览器和 Node.js 环境普遍支持。如果需要支持非常老的浏览器(如 IE11),需要使用 polyfill(例如 Babel 提供的)或替代方法(如 Array.prototype.slice.call(arrayLike))。
  2. length 属性是关键: 对于类数组对象,必须有 length 属性,且其值应为非负整数。Array.from() 会读取这个 length 值来确定新数组的长度。
  3. 非索引属性: 类数组对象中的非数字索引属性(如上面的 name: ‘My Array-Like’)在转换过程中会被忽略。
  4. 稀疏处理: 如果类数组对象的索引不连续(稀疏),新数组对应的位置将是 undefined。

总结:

Array.from() 是 JavaScript 中处理类数组和可迭代对象转换的强大工具。它的核心价值在于:

  1. 将类数组/可迭代对象安全、方便地转换为真正的数组,从而解锁所有数组方法(map, filter, reduce, forEach 等)。
  2. 提供内置的映射功能,允许在转换过程中直接修改元素。
  3. 简洁地生成数值序列。

熟练掌握 Array.from() 能显著提高处理 DOM 集合(NodeList)、函数参数(arguments)、集合类型(Set, Map)、字符串以及创建特定序列数组的效率和代码可读性。

http://www.dtcms.com/a/263232.html

相关文章:

  • 容器化 vs 虚拟机:什么时候该用 Docker?什么时候必须用 VM?
  • 本地部署kafka4.0
  • RPC-Client模块
  • 从0到亿级数据抓取:亮数据如何破解全球采集难题?
  • 《燕云十六声》全栈技术架构深度解析
  • 算法与数据结构:解决问题的黄金搭档
  • 后台管理系统的诞生 - 利用AI 1天完成整个后台管理系统的微服务后端+前端
  • spring-ai-alibaba 1.0.0.2 学习(四)——语句切分器、文档检索拦截器
  • JavaEE初阶第五期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(三)
  • 区块链技术有哪些运用场景?
  • Nacos 3.0 架构全景解读,AI 时代服务注册中心的演进
  • SpringCloud微服务 Eureka服务注册与发现
  • python训练打卡DAY40
  • OpenCV计算机视觉实战(14)——直方图均衡化
  • 88.LMS当幅度和相位同时失配时,为啥最后权值w的相位angle(w(end))收敛到angle(mis)不是-angle(mis)
  • 【机器人】复现 HOV-SG 机器人导航 | 分层 开放词汇 | 3D 场景图
  • 洛谷 P1449:后缀表达式 ← 数组模拟栈
  • JAX study notes[11]
  • vue-32(部署一个 Nuxt.js 应用程序)
  • 【PaddleOCR】PP-OCRv5:通用 OCR 产线的卓越之选
  • 一文详解Modbus协议原理、技术细节及软件辅助调试
  • 2025 湖南大学程序设计竞赛(补题)
  • 基于F5TTS的零样本语音合成
  • 第9篇:Gin配置管理-Viper的实战使用
  • 《JMS 消息重试机制与死信队列配置指南:以 IBM MQ 与 TongLinkQ 为例》
  • Java中的锁思想
  • Java开发者转型AI时代的路径
  • js代码04
  • (LeetCode 面试经典 150 题) 135. 分发糖果 (贪心)
  • vue3 el-table 列增加 自定义排序逻辑