array.from的第二个参数是映射函数,遍历源对象时对每个存在元素调用一次,接收当前项、索引、源对象三个参数,仅处理实际存在的元素,不触发稀疏空位,且比先array.from再map更高效。

Array.from 的第二个参数是一个映射函数,它会在创建新数组时对每个元素执行一次,效果等同于先用 Array.from 生成数组,再调用 .map() ——但更高效,因为只遍历一次。
映射函数的参数和执行时机
该函数接收三个参数:当前项、索引、源对象(即第一个参数提供的类数组或可迭代对象)。它在 Array.from 内部逐项调用,且仅对实际存在的元素调用(跳过稀疏数组中的空位)。
- 对于字符串、Set、Map 的键/值等可迭代对象,索引从 0 开始递增
- 对于类数组对象(如
{length: 3}),只处理索引 0、1、2 对应的属性(若存在) - 如果源对象没有对应索引的属性(例如
{length: 3, 0: 'a', 2: 'c'}),索引 1 处的调用会收到undefined作为第一个参数
常见实用写法
直接在第二个参数中完成数据转换,避免额外 map 步骤:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 将类数组转为数字数组:
Array.from(document.querySelectorAll('input'), el => +el.value) - 生成指定长度的序列数组:
Array.from({length: 5}, (_, i) => i * 2)→[0, 2, 4, 6, 8] - 去重并转换 Set:
Array.from(new Set([1,2,2,3]), x => x * x)→[1, 4, 9]
与直接 map 的关键区别
映射函数作用于“被遍历的源”,不是最终数组。这意味着:
- 无法访问尚未生成的新数组(比如不能用
this指向结果数组) - 源对象不可变,函数纯度影响结果——不建议在其中修改源对象
- 若源是稀疏数组(如
[1,,3]),映射函数不会被调用于空槽位,结果数组也保持稀疏(但现代引擎通常填充为undefined,行为取决于实现)
注意事项
第二个参数必须是函数;传入非函数会报错。若不需要映射,显式传 undefined 或省略该参数,否则可能意外触发转换:
- 错误写法:
Array.from([1,2,3], parseInt)→[1, NaN, NaN](因 parseInt 第二个参数被当作进制) - 安全写法:
Array.from([1,2,3], x => parseInt(x))或直接省略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










