array.of 不适合做默认参数,因为它每次调用都新建数组,无法区分“未传参”和“传了空数组[]”,且语义不清;推荐直接用[]字面量。

Array.of 在函数默认参数中并不常用,也不推荐直接用于定义默认数组参数。
为什么 Array.of 不适合做默认参数
Array.of 的设计目标是“创建一个包含指定元素的新数组”,它不会像 Array(n) 那样根据数字参数创建稀疏数组。但它本身不解决“默认值是否已提供”的逻辑问题——而默认参数的核心在于“当实参未传或为 undefined 时才启用”。Array.of() 每次调用都返回一个新数组,无法区分用户是否主动传了空数组 [] 还是根本没传参。
- 若写成
function foo(arr = Array.of()),每次调用都会新建一个空数组,看似可行,但掩盖了语义:你真正想表达的是“没给 arr 就用空数组”,而非“调用 Array.of()” - 更关键的是,如果用户传了
[](空数组),它和Array.of()返回的[]在值上等价,但逻辑意图不同——前者是明确传入的空数组,后者是兜底生成的。用 Array.of 无法保留这种区别
更清晰、更常用的写法
直接使用字面量 [] 作为默认值,语义明确、性能好、可读性强:
function processItems(items = []) { /* ... */ }- 如果需要预设初始元素,也直接写:
function createList(data = ['default']) { /* ... */ } - 若需动态生成(比如依赖参数),可用短路运算或三元判断:
function init(arr = (len) => Array.from({ length: len }, (_, i) => i))—— 但这属于函数体内部逻辑,不是默认参数本身
Array.of 的真实适用场景
Array.of 主要用于避免 Array 构造函数的歧义,尤其在处理单个数值时:
-
Array(3)→[empty × 3](长度为 3 的稀疏数组) -
Array.of(3)→[3](含一个元素 3 的数组) - 所以它适合“把一组值无歧义地转为数组”,例如:
Array.of(x, y, z)或封装工具函数:const toArray = (...args) => Array.of(...args)
默认参数 + 数组操作的实用建议
若默认数组需参与后续修改(如 push、splice),注意避免意外共享引用(虽然 [] 每次都是新对象,但若默认值是变量引用则另当别论):
- ✅ 安全:
function add(item, list = []) { list.push(item); return list; } - ❌ 危险(除非刻意):
const DEFAULT_LIST = []; function bad(list = DEFAULT_LIST) { list.push(1); }—— 多次调用会累积修改同一个数组 - 需要复用逻辑时,可结合解构与默认值:
function handle([first, ...rest] = []) { /* first 可能为 undefined */ }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











