JavaScript数组的keys()方法返回索引迭代器而非索引数组,需用for...of、展开运算符或Array.from()转换;它遍历所有数字索引(含稀疏数组空位),不适用于普通对象。

JavaScript 中数组的 keys() 方法返回一个**数组迭代器对象**,用于遍历数组元素的**索引(即数字键)**,而不是值。它不适用于普通对象,仅对数组(包括类数组)有效。
keys() 返回的是索引迭代器,不是数组
Array.prototype.keys() 不直接返回索引数组,而是返回一个可迭代对象(Iterator),需配合 for...of、展开运算符 [...] 或 Array.from() 使用才能获取实际索引值。
- 直接打印
arr.keys()会看到类似Array Iterator {}的对象,不能直接用.forEach()或下标访问 - 常见误用:
arr.keys()[0]→undefined(因为不是数组)
正确获取并遍历索引的几种方式
假设有一个数组:const arr = ['a', 'b', 'c'];
-
用 for...of 遍历索引:
for (const index of arr.keys()) { console.log(index); } // 输出 0, 1, 2 -
转成数组后操作:
const indices = [...arr.keys()]; // [0, 1, 2]
indices.forEach(i => console.log(i)); -
配合 entries() 获取「索引 + 值」:
for (const [index, value] of arr.entries()) { console.log(index, value); } // 0 'a', 1 'b', 2 'c'
注意:keys() 遍历的是「存在」的索引,跳过空位(稀疏数组)
对于稀疏数组(如 const arr = ['a', , 'c'];,中间是空位),keys() 仍会返回所有索引(包括空位对应的索引),因为索引存在,只是值为 undefined:
-
arr.keys()→ 迭代0, 1, 2(不是0, 2) - 这与
for...in不同(for...in可能受原型影响,且不保证顺序) - 也与
Object.keys(arr)行为一致(只返回可枚举的自有数字属性名)
不推荐用 keys() 替代传统 for 循环的场景
如果只需简单遍历索引,传统 for (let i = 0; i 更直观、性能略优,尤其在大量数据或性能敏感场景。而 <code>keys() 的优势在于语义清晰(明确表达“我要索引”)、与迭代协议统一、便于函数式组合(如链式调用 filter + map 需先转数组)。


















