array.from用于将类数组或可迭代对象转为真实数组,支持映射与填充;array.of则安全创建含任意参数的数组,避免new array()的歧义。

Array.from 和 Array.of 是 ES6 新增的两个静态方法,它们解决了传统数组构造方式(如 new Array() 或字面量 [])在某些场景下的歧义与局限,让数组创建和类型转换更直观、可控。
用 Array.from 转换类数组或可迭代对象
它能把任何「有 length 属性的对象」或「实现了 Symbol.iterator 的可迭代对象」转为真正的数组,常用于处理 DOM 节点列表、字符串、Map/Set、甚至自定义对象。
- 转换 NodeList:
Array.from(document.querySelectorAll('div'))→ 得到真实数组,可直接链式调用.map()、.filter() - 拆分字符串:
Array.from('hello')→['h', 'e', 'l', 'l', 'o'],比'hello'.split('')更语义清晰(且能正确处理 Unicode 表情等) - 配合映射函数:第二个参数是 map 回调,等价于先转数组再 .map(),但更高效:
Array.from([1, 2, 3], x => x * 2)→[2, 4, 6] - 从空数组占位生成序列:
Array.from({length: 5}, (_, i) => i)→[0, 1, 2, 3, 4],避免了new Array(5).map(...)因空位跳过导致的[undefined, undefined, ...]问题
用 Array.of 安全创建含原始值的数组
它只做一件事:把所有传入参数原样作为元素,**无视参数个数和类型**,彻底避开 new Array() 的陷阱。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 单个数字不再歧义:
Array.of(5)→[5];而new Array(5)→ 创建长度为 5 的空数组(5 个 empty slot) - 多个数字也无压力:
Array.of(1, 2, 3)→[1, 2, 3],和字面量一致;new Array(1, 2, 3)虽然结果相同,但逻辑不统一 - 混合类型安全:
Array.of(undefined, null, 'a', {})→ 明确按顺序存入四个元素,不会因undefined或null引发意外行为
两者搭配使用的实用场景
当需要从非标准结构中提取并加工数据时,组合使用很自然:
- 从表单元素批量取值并转为数字:
Array.from(form.querySelectorAll('input'), el => +el.value) - 把 Map 的键或值转数组:
Array.from(myMap.keys())、Array.from(myMap.values()) - 复制并修正稀疏数组:
Array.from(sparseArr, x => x ?? 0)把空位补 0,得到稠密数组 - 结合 Array.of 构造中间结构:
const rows = data.map(item => Array.of(item.id, item.name, item.active)),确保每行都是明确三元素数组
注意边界情况
它们不是万能的,需留意:
-
Array.from(null)或Array.from(undefined)会报错(无法读取 length),应先判空 -
Array.from对普通对象(无 length 也无 iterator)无效,比如{a:1, b:2}需用Object.values()先转 -
Array.of不做类型转换,传入字符串'1'就是字符串,不会自动转数字 - 性能敏感场景下,简单字面量
[1,2,3]仍比Array.of(1,2,3)更快,无需强行替换
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










