Array.prototype.keys() 返回键名迭代器,可被扩展运算符展开为索引数组;正确写法是[...arr.keys()],如['a','b','c'].keys()展开为[0,1,2]。

Array.prototype.keys() 返回一个键名迭代器(Iterator),它按索引顺序产出数组的下标(0, 1, 2, …),类型是 number。这个迭代器本身不是数组,但它是可迭代对象(iterable),因此可以被扩展运算符 ... 展开。
结合扩展运算符,就能把 keys() 迭代器直接转成一个由数字组成的数组——也就是你想要的“数字序列”。
✅ 正确写法:用 ...arr.keys() 生成索引数组
const arr = ['a', 'b', 'c']; const indices = [...arr.keys()]; console.log(indices); // [0, 1, 2]
这行代码等价于手动遍历索引,但更简洁、函数式。
? 原理说明
-
arr.keys()返回的是Array Iterator对象,内部实现了@@iterator方法; - 扩展运算符
...只作用于可迭代对象,会隐式调用其next()方法,直到done: true; -
keys()迭代器每次next()返回{ value: 当前索引, done: false },所以展开后就是纯数字序列。
⚠️ 注意:不能写成
[...arr.keys](漏了括号),那会报错,因为keys是方法,不是属性。
? 实用场景举例
1. 生成长度为 n 的连续数字数组(不依赖原数组内容)
const n = 5; const nums = [...Array(n).keys()]; // [0, 1, 2, 3, 4]
Array(n)创建一个长度为n的稀疏数组(空位),.keys()仍能正确产出0到n-1的索引。
2. 配合 map 构造带偏移的序列(比如从 1 开始)
const oneBased = [...Array(3).keys()].map(i => i + 1); // [1, 2, 3]
3. 和解构结合,取前几个索引
const [first, second] = [...Array(10).keys()]; console.log(first, second); // 0 1
❌ 常见误区
-
Array.from(arr.keys())也能得到相同结果,但多了一层封装,没必要; -
...arr.keys()不能直接用于函数调用参数(如fn(...arr.keys()))除非fn明确接收多个数字参数; -
keys()不受数组实际元素影响——哪怕全是undefined或空位,只要length是 5,就产出[0,1,2,3,4]。
不复杂但容易忽略:keys() + ... 是生成自然数序列最轻量、最语义清晰的方式之一,比 Array.from({ length: n }, (_, i) => i) 更直观。











