array.from 可将类数组或可迭代对象转为数组,并在转换时通过映射函数批量处理元素,避免中间数组开销,支持填充、转换、解构、默认值等灵活操作,但不支持异步处理。

Array.from 不仅能将类数组或可迭代对象转为数组,还能在转换过程中直接对每个元素做处理,实现“一步到位”的批量操作。
利用 map 回调函数批量转换
Array.from 的第二个参数是一个映射函数,作用等同于 map,但无需先生成原始数组再调用 map —— 减少中间数组开销。
- 把字符串每个字符转为大写:
Array.from('hello', c => c.toUpperCase())→['H','E','L','L','O'] - 生成指定长度的数组并填充索引平方:
Array.from({length: 5}, (_, i) => i ** 2)→[0, 1, 4, 9, 16] - 从 NodeList 批量提取文本内容:
Array.from(document.querySelectorAll('li'), el => el.textContent.trim())
配合解构或条件逻辑做灵活处理
映射函数内可嵌入任意逻辑,比如解构、类型判断、默认值 fallback,适合处理结构不一的数据源。
- 从对象数组中安全取值(避免 undefined):
Array.from(items, ({name, id = 0}) => ({id, name: name || '未知'})) - 过滤 + 转换一体化(注意:Array.from 不过滤,需在回调中返回有效值或用 undefined 占位):
Array.from(data, item => item.active ? {id: item.id, label: item.title} : undefined).filter(Boolean) - 将 Set 去重后转数组并转为小写:
Array.from(new Set(['A','b','A']), s => s.toLowerCase())
替代 Array(n).fill().map() 的更优写法
过去常用 Array(5).fill().map((_, i) => i * 2) 生成序列,但 fill() 创建的是稀疏数组,语义不清;Array.from 更直观且无坑。
- 生成 0 到 n-1 的数字数组:
Array.from({length: n}, (_, i) => i) - 生成偶数数组:
Array.from({length: 5}, (_, i) => i * 2) - 生成带随机数的数组:
Array.from({length: 3}, () => Math.random().toFixed(2))
注意 this 绑定与异步场景限制
Array.from 是同步方法,其映射函数无法 await;若需异步批量处理,应先转为数组再用 Promise.all,而非依赖 Array.from 内部处理。
- 错误示范(不会等待):
Array.from(items, async item => await fetchItem(item))→ 返回全是 Promise 对象,未 resolve - 正确做法:
const arr = Array.from(items); const results = await Promise.all(arr.map(item => fetchItem(item))) - this 在映射函数中默认为 undefined(严格模式),如需绑定上下文,可用箭头函数或显式 bind
它不是万能的 map 替代品,但在构造+转换一体的场景下,语义清晰、性能干净、代码简洁。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











