推荐使用 Array.from({ length: n }, () => val) 创建指定长度且每个元素为同一值的稠密数组,它安全可靠、支持引用类型独立实例化;原始值场景可用 Array(n).fill(val),但避免 Array(n).map() 因稀疏数组失效。

JavaScript 中没有原生的 “Array-of” 语法(如 Rust 的 [val; n] 或 Python 的 [val] * n),但有几种简洁、安全、常用的方式快速创建指定长度且**每个元素都为同一值**的数组。关键要避开 Array(n).fill(val) 的潜在陷阱(如稀疏数组问题)和 Array(n).map(...) 的失效问题。
✅ 推荐:Array.from + 映射函数(最可靠)
这是最推荐的方式,适用于任意初始值(包括对象、函数等引用类型),且明确生成稠密数组:
Array.from({ length: 5 }, () => 0); // [0, 0, 0, 0, 0]
Array.from({ length: 3 }, () => 'hi'); // ['hi', 'hi', 'hi']
Array.from({ length: 2 }, (_, i) => i * 2); // [0, 2] —— 支持索引
Array.from({ length: 4 }, () => ({})); // [{}, {}, {}, {}] —— 每个对象独立
说明:
– { length: n } 是一个类数组对象,Array.from 会按 length 创建 n 项;
– 第二个参数是映射函数,对每一项调用,返回对应元素值;
– 即使传入的是引用类型(如空对象),每次调用都会新建一个,避免共享引用问题。
✅ 简单数值/原始值:Array(n).fill(val)
当值是原始类型(number、string、boolean、null、undefined)且不需要索引逻辑时,可直接用 fill:
Array(5).fill(7); // [7, 7, 7, 7, 7]
Array(3).fill('x'); // ['x', 'x', 'x']
Array(4).fill(undefined); // [undefined, undefined, undefined, undefined]
⚠️ 注意:
– Array(5) 创建的是**稀疏数组**(5 个 empty slot),但 .fill() 会将其转为稠密数组,行为安全;
– 不可用于需独立对象的场景:Array(2).fill({}) 会导致两个元素引用同一个对象。
❌ 避免:Array(n).map(...)(不生效)
以下写法**不会得到预期结果**:
立即学习“Java免费学习笔记(深入)”;
Array(3).map(() => 'a'); // [empty × 3] —— map 跳过空槽,返回空数组
原因:ES 规范中,map、filter 等迭代方法会忽略稀疏数组中的空位。必须先让数组“实化”,例如:
[...Array(3)].map(() => 'a'); // ['a', 'a', 'a'] —— 展开成 [undefined, undefined, undefined] 再 map
但这种写法不如 Array.from 直观、高效,也不推荐用于生产环境。
? 小技巧:封装成可复用函数
如果高频使用,可以封装一个轻量工具函数:
const arrayOf = (n, fn) => Array.from({ length: n }, fn);
// 用法
arrayOf(4, () => 1); // [1, 1, 1, 1]
arrayOf(3, (_, i) => i ** 2); // [0, 1, 4]
这样既保持语义清晰,又避免重复写样板代码。










