array.from 可将类数组或可迭代对象转为数组并内置映射功能,通过第二个参数映射函数在构造时转换元素,比扩展运算符加 map 更高效;支持 this 绑定、处理空位、生成序列等,且不跳过稀疏数组的空位。

Array.from 不仅能将类数组或可迭代对象转为数组,还内置了映射能力——在创建新数组的同时直接对每个元素做转换,省去额外的 map() 调用,写法更简洁、性能略优。
利用第二个参数作为映射函数
Array.from 的第二个参数是一个映射函数,接收当前项、索引和原对象(可选),作用等同于 map 回调,但执行时机更早(在数组构造过程中)。
- 语法:Array.from(iterable, mapFn, thisArg)
- 比 [ ...iterable ].map(fn) 少一次遍历,尤其适合大数据量场景
- 映射函数中 this 指向由第三个参数指定,不传则为 undefined(严格模式下)
常见转换场景示例
从字符串提取 ASCII 码、从 NodeList 提取文本、生成带索引的结构化数据等,都可一步到位:
- 字符串转码点数组:Array.from('hello', c => c.charCodeAt(0)) → [104, 101, 108, 108, 111]
- DOM 节点批量取 innerText:Array.from(document.querySelectorAll('li'), el => el.innerText)
- 生成带序号的对象列表:Array.from({length: 3}, (_, i) => ({id: i + 1, name: `item${i + 1}`}))
注意与 Array.prototype.map 的差异
Array.from 的映射函数不跳过空位(sparse array 中的 empty slot 会被视为 undefined 并传入),而 map 会跳过;另外,Array.from 对非可迭代对象会报错,map 则要求调用者已是数组。
- Array.from([1, , 3], x => x * 2) → [2, undefined, 6](空位被当作 undefined 处理)
- [1, , 3].map(x => x * 2) → [2, empty, 6](保留空位,不调用回调)
- Array.from(null) 报错;[].map.call(null, fn) 也报错,但错误位置和提示略有不同
结合 Array.from 的 length 特性做范围生成
传入 {length: n} 这类伪数组对象,配合映射函数,是生成数字序列或初始化数组的常用技巧,比 new Array(n).fill().map() 更语义清晰且不依赖 fill。
- 生成 0 到 n-1 数组:Array.from({length: 5}, (_, i) => i) → [0, 1, 2, 3, 4]
- 生成随机数数组:Array.from({length: 3}, () => Math.random())
- 避免陷阱:不要用 new Array(5).map((_, i) => i),因为 new Array(5) 创建的是稀疏数组,map 不会遍历空位
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











