array.of将所有参数原样转为数组元素,不作类型判断、展开或转换;如array.of(4)返回[4]而非长度为4的空数组,彻底规避new array(4)的歧义陷阱。

Array.of 不会对参数做类型判断或特殊处理,无论传入的是原始值还是对象、函数、数组等非原始类型,它都直接将每个参数作为独立元素放入新数组。
非原始类型参数被原样放入数组
Array.of 的核心行为是“逐个收参”,不展开、不转换、不过滤。传入一个对象、一个函数、甚至另一个数组,它们都会成为新数组中的一项,且引用关系保持不变。
- 例如:
Array.of({a: 1}, [2, 3], function(){} )返回[{a: 1}, [2, 3], function(){}] - 传入 null 或 undefined 也照单全收,不会跳过或转成其他值
- 与
Array(3)不同,Array.of(3)创建的是[3],而非长度为 3 的空数组
与 Array 构造函数的关键区别
当参数只有一个且为数字时,Array(5) 会创建长度为 5 的稀疏数组,而 Array.of(5) 总是返回 [5]。这种差异在传入对象时同样成立:两者都不会尝试解析或展开对象,但构造函数在单数字参数下有歧义行为,Array.of 则始终一致。
Array({x: 1})→[{x: 1}](此时表现相同)Array(10)→[];Array.of(10)→[10]- 对非原始类型而言,二者结果通常一致,但语义更明确:Array.of 没有“构造数组长度”的逻辑
注意引用共享问题
如果传入的是可变对象(如普通对象、数组),新数组中保存的是该对象的引用,不是深拷贝。修改原对象会影响数组中的对应项,反之亦然。
- 例如:
const obj = {v: 1}; const arr = Array.of(obj); arr[0].v = 99;后,obj.v也变成 99 - 若需隔离,应手动克隆,比如用
Array.of({...obj})或Array.of(Array.from(arr)) - 函数、正则、日期等对象同理,都是引用传递
没有自动展开或递归处理
Array.of 不识别嵌套结构,也不会调用 Symbol.iterator。即使传入类数组对象或具有迭代器的结构,它仍视为单个元素。
Array.of([1,2,3])→[[1,2,3]],不是[1,2,3]Array.of(new Set([1,2]))→[Set(2) {1, 2}],不会展开为数组项- 如需展开,应配合扩展运算符:
Array.of(...[1,2,3])
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











