Array.of()的核心作用是避免Array构造函数对单个数字参数的歧义处理,始终将所有参数作为数组元素创建新数组。例如Array(5)生成长度为5的空数组,而Array.of(5)返回[5];它支持任意数量和类型的参数,无参时返回空数组,行为统一可预测。

Array.of() 的核心作用,就是绕过 Array 构造函数在接收单个数字参数时的特殊行为——它不会把那个数字当作数组长度,而是直接把它当作数组的第一个元素。
为什么 Array(10) 会出问题?
原生 Array 构造函数对单个参数做了特殊处理:如果参数是正整数(且无小数、非 NaN、非 Infinity),就创建一个指定长度的空数组,而非包含该值的数组。
-
Array(5)→[empty × 5](长度为 5 的稀疏数组) -
Array(0)→[](空数组) -
Array('5')→['5'](字符串不触发长度逻辑) -
Array(3.14)→[3.14](非整数也不触发)
Array.of() 是怎么解决的?
Array.of() 完全忽略“长度推断”逻辑,它只做一件事:把所有传入的参数,原封不动地变成数组元素,无论参数个数或类型。
-
Array.of(10)→[10] -
Array.of(0)→[0] -
Array.of(5, 'a', true)→[5, 'a', true] -
Array.of()→[](无参时返回空数组)
什么时候该用 Array.of()?
当你明确想“构造一个包含某些值的数组”,尤其参数可能动态生成、无法预判个数或类型时,Array.of() 更安全可靠。
- 封装工具函数:
function makeArray(...items) { return Array.of(...items); } - 配合解构或映射结果:
Array.of(...someIterable)或list.map(x => x * 2).map(Array.of) - 避免条件判断:
const arr = n => Number.isInteger(n) && n >= 0 ? [n] : Array(n);这种逻辑可直接简化为Array.of(n)
注意:它不是万能替代
Array.of() 不替代 Array.from() 或扩展运算符。它不处理类数组、可迭代对象或映射转换;它只负责“参数到数组元素”的直译。
- 要从字符串转数组?用
[...'abc']或Array.from('abc'),别用Array.of('abc')(得到['abc']) - 要按长度初始化并填充?用
Array(5).fill(0)或Array.from({length: 5}, () => 0) -
Array.of()的价值在于“确定性”:输入即输出,不隐式变形

















