Array.from 的第二个参数是映射函数,边构建新数组边转换元素,只遍历一次,接收 item、index、arrayLike 三个参数,适用于字符串、Set、Map、arguments、DOM 集合等,支持任意返回类型,且需注意 this 绑定问题。

Array.from 的第二个参数是一个映射函数(mapFn),它能在创建新数组的同时对每个元素做格式化处理,相当于 Array.from(arrayLike, mapFn) 等价于 Array.from(arrayLike).map(mapFn),但更高效——因为只遍历一次。
用法本质:边构建边转换
第二个参数不是“额外操作”,而是构造过程的一部分。它接收三个参数:item(当前项)、index(索引)、arrayLike(原始类数组对象),和 Array.prototype.map 完全一致。
- 适用于字符串、Set、Map 的键/值、arguments、DOM 集合等任何可遍历的类数组结构
- 返回值直接成为新数组对应位置的元素,支持任意类型(包括对象、计算结果、null 等)
- 若不传第二个参数,新数组内容与原结构一一对应;传了就自动应用转换逻辑
常见格式化场景示例
比如将字符串中每个字符转为大写并加括号:
Array.from('abc', x => `(${x.toUpperCase()})`) // ['(A)', '(B)', '(C)']再如将 NodeList 转为带索引信息的数组:
立即学习“Java免费学习笔记(深入)”;
Array.from(document.querySelectorAll('div'), (el, i) => ({ id: el.id, index: i }))又或者把 Set 中的数字统一乘以 2:
Array.from(new Set([1, 2, 3]), n => n * 2) // [2, 4, 6]注意 this 绑定与箭头函数限制
如果映射函数依赖 this,需显式绑定(箭头函数无法通过 call/apply 改变 this):
- 正确写法:
Array.from(arr, function(x) { return this.prefix + x; }, { prefix: 'item-' }) - 错误写法:
Array.from(arr, (x) => this.prefix + x)(此时this指向外层作用域,非传入对象)
对比 Array.from(...).map(...) 的实际差异
表面上效果相同,但性能与语义不同:
- 两次遍历 vs 一次遍历:后者少一次循环,对大数据量更友好
- 内存分配更优:无需先生成中间数组再映射
- 语义更清晰:“从某结构出发,按规则生成数组”比“先转数组再改”更贴近意图


















