Array.from()用于将类数组或可遍历对象转换为新数组,支持映射处理;Array.of()则安全地将所有参数原样转为数组元素,避免Array()构造函数的歧义。

ES6 的 Array.from() 和 Array.of() 都能创建新数组,但用途和行为完全不同:前者用于“转换类数组或可遍历对象”,后者用于“安全地创建含任意参数的新数组”。
Array.from():把类数组或可遍历结构转成真数组
它接收一个类数组对象(如 arguments、NodeList)或任意可迭代对象(如 String、Set、Map 的键/值),返回一个全新的数组。
- 第一个参数是必须的,表示要转换的数据源
- 第二个参数可选,是一个映射函数,类似
map,用于对每个元素做处理 - 第三个参数可选,用来指定映射函数中的
this值
例如:
// DOM 节点列表转数组,再过滤出带 data-id 的元素
const buttons = document.querySelectorAll('button');
const arr = Array.from(buttons, btn => btn.dataset.id);
// 字符串转数组并转大写
Array.from('abc', x => x.toUpperCase()); // ['A', 'B', 'C']
// 用 Set 去重后转数组
Array.from(new Set([1, 2, 2, 3])); // [1, 2, 3]
Array.of():不管参数多少或类型,都把它们当元素放进新数组
它解决的是 Array() 构造函数的歧义问题。比如 Array(3) 创建的是长度为 3 的空数组,而 Array.of(3) 创建的是包含一个元素 3 的数组。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 有多少个参数,新数组就有多少个元素
- 不关心参数是不是数字、
undefined或其他类型,全部原样放入 - 没有“单个数字参数 → 空数组”的特殊逻辑
例如:
Array.of(1, 2, 3); // [1, 2, 3]
Array.of(5); // [5]
Array.of(undefined); // [undefined]
Array.of(); // []
Array.of(null, 'a', {}); // [null, 'a', {}]
别混淆:Array() 构造函数不是 Array.of()
Array(3) 和 Array.of(3) 表现不同,这是最常踩的坑:
-
new Array(3)→ 创建[empty × 3](三个空槽,length === 3) -
Array.of(3)→ 创建[3](一个元素,length === 1) -
Array(1, 2, 3)和Array.of(1, 2, 3)结果一样,都是[1, 2, 3];但逻辑不同,前者依赖参数个数判断,后者始终按元素处理
怎么选?看你要什么
- 想把
document.querySelectorAll、arguments、字符串、Set 等变成数组 → 用Array.from() - 想确保传进去的每一个参数都成为数组元素,尤其参数可能只有一个数值时 → 用
Array.of() - 只是写
[1, 2, 3]这种字面量?不用任何方法,直接用方括号最简单

















