[...array(n).keys()] 可生成 [0, 1, ..., n-1],因 array(n) 创建长度为 n 的稀疏数组,.keys() 返回其索引迭代器,展开后得连续整数数组。

直接用 Array.prototype.keys() 配合展开运算符([...])**不能直接生成 0 到 N 的整数数组**,因为 keys() 返回的是一个**迭代器对象**,它本身不包含实际的数字值,而是按索引顺序生成键 —— 但前提是它被调用在**已存在且有长度的数组上**。
为什么 Array.keys() 本身不“凭空”产生数字?
Array.prototype.keys() 是数组实例的方法,必须作用于一个数组。它不会创建新数组,也不会自动填充元素。例如:
Array.keys() 不是静态方法,Array.keys(5) 会报错;你不能写 Array.keys().next() 来获取 0 —— 因为没有调用上下文。
正确用法:先创建占位数组,再取 keys
要得到 [0, 1, 2, ..., N-1],需先构造一个长度为 N 的数组(元素可为空),再对其调用 .keys(),最后用展开运算符转为数组:
-
核心步骤:
[...Array(N).keys()] -
Array(N)创建一个长度为N、所有元素为empty(空槽)的稀疏数组 -
.keys()返回该数组索引的迭代器:0 → 1 → 2 → … → N−1 -
[...]消费迭代器,生成密集数组[0, 1, 2, ..., N-1]
常见写法与注意事项
✅ 推荐写法(简洁安全):
[...Array(5).keys()] // → [0, 1, 2, 3, 4]
⚠️ 注意事项:
-
Array(5)不等于[undefined, undefined, ...],它是稀疏数组,但.keys()只关心索引范围,不影响结果 - 不要写
[...new Array(5).keys()]—— 效果相同,但new Array(5)和Array(5)在此场景无区别 - 避免
Array.from({length: N}).keys()等绕路写法,不够直观
如果需要 0 到 N(含 N)怎么办?
只需把长度设为 N + 1:
[...Array(N + 1).keys()] // → [0, 1, 2, ..., N]
例如:[...Array(6).keys()] 得到 [0,1,2,3,4,5],即 0 到 5(含)。
不复杂但容易忽略:keys() 依赖数组长度,不是魔法数字生成器 —— 关键在先有“壳”,再取“序号”。










