Array.of 在函数式工具库中是轻量、精准的数组构造方法,用于安全包装单值、统一参数处理、避免 Array 构造器歧义,且不替代 Array.from。

Array.of 在函数式工具库中不是核心构造方法,但它的“精确按参数创建数组”特性,在封装高阶函数、避免类数组陷阱、统一输入处理时非常实用。
精准构造,绕过 Array 构造器的歧义
Array 构造器对单个数字参数有特殊行为(Array(3) → [empty × 3]),而 Array.of(3) 明确返回 [3]。在工具库中封装如 alwaysArray、wrap 这类辅助函数时,用 Array.of 可杜绝意外空位:
-
const wrap = x => Array.of(x)—— 安全包装任意值为单元素数组 -
const tuple = (...args) => Array.of(...args)—— 比Array(...args)更可靠(后者对稀疏或非数组类数组可能出错)
配合解构与 rest 参数,强化函数签名一致性
函数式工具常需把不确定数量的参数转为数组处理(如 pipe、compose 的中间函数链)。用 Array.of(...args) 不如直接用 rest 参数,但 Array.of 在需要“忽略调用上下文、只认传入值”的场景更干净:
- 实现
curryN(n, fn)时,收集前 n 个参数:可用Array.of(...args).slice(0, n),不依赖args是否为真数组 - 封装
mapOver类函数时,若允许传入单值或数组,Array.of(input)统一为数组,再.flat()或判别处理
轻量替代方案,避免引入外部依赖
很多工具库倾向零依赖。相比手写 Array.isArray(x) ? x : [x],Array.of(x) 更简洁、语义清晰,且兼容所有现代环境(ES6+)。尤其在构建微型函数式模块(如仅含 maybe、either、list 基础类型)时,它提供标准、无副作用的数组构造方式:
立即学习“Java免费学习笔记(深入)”;
- 不修改原型,不污染全局
- 无 polyfill 成本(Node.js 4+、Chrome 45+、Firefox 25+ 均原生支持)
- 比
[x]更具意图性——明确表达“将参数列表转为数组”,而非仅字面拼接
注意边界:不替代 Array.from,也不处理类数组对象
Array.of 只关心函数调用时的实参,不遍历可迭代对象或转换类数组(如 arguments、NodeList)。这点要和 Array.from 分清:
- 需要从
document.querySelectorAll('div')创建数组?用Array.from或展开运算符 - 需要把
fn(a, b, c)的三个参数变成[a, b, c]?Array.of(a, b, c)或 rest 参数更直接 - 工具库中若暴露通用“转数组”函数,应优先用
Array.from(x) || [x],而非盲目替换为Array.of


















