数组的keys()、values()、entries()是Array.prototype上的迭代器方法:keys()返回索引迭代器,values()返回元素值迭代器,entries()返回[索引, 元素]迭代器,均需for...of或Array.from()等消费。

这三个方法不是用于数组的,而是 Object 的原型方法,作用在普通对象(plain object)上,用来获取其键、值或键值对的迭代器。数组本身没有 keys()、values()、entries() 这三个自有方法——但 Array 原型上确实有同名方法,它们是专门为数组设计的,行为与 Object 上的不同。
数组的 keys()、values()、entries() 是什么?
ES6 为 Array.prototype 添加了这三个方法,返回的是 Array Iterator 对象,可用于 for...of 或展开运算符(...)等迭代场景。
-
arr.keys():返回索引的迭代器(0, 1, 2, ...) -
arr.values():返回元素值的迭代器(等价于arr[Symbol.iterator]()) -
arr.entries():返回 [索引, 元素] 数组的迭代器,类似 Map 的 entries
怎么用?举个实际例子
假设有一个数组:const arr = ['a', 'b', 'c'];
-
arr.keys()→ 迭代器,遍历时得到0,1,2 -
arr.values()→ 遍历时得到'a','b','c' -
arr.entries()→ 遍历时得到[0, 'a'],[1, 'b'],[2, 'c']
你可以这样使用:
for (const key of arr.keys()) console.log(key); // 0, 1, 2<br>for (const val of arr.values()) console.log(val); // 'a', 'b', 'c'<br>for (const [i, v] of arr.entries()) console.log(i, v); // 0 'a', 1 'b', 2 'c'
和 Object 的同名方法别混淆
Object 的 Object.keys() 等是静态方法,返回的是 数组(不是迭代器),比如:
-
Object.keys({a:1, b:2})→['a', 'b'](数组) -
Object.values()和Object.entries()同理,都返回数组
而数组的这三者返回的是 迭代器对象,不能直接索引(如 arr.keys()[0] 会报错),必须用 for...of、Array.from() 或 ... 展开才能转成数组:
Array.from(arr.keys()) // [0, 1, 2]<br>[...arr.values()] // ['a', 'b', 'c']<br>Array.from(arr.entries()) // [[0,'a'], [1,'b'], [2,'c']]
小贴士:entries() 最常用也最灵活
arr.entries() 是唯一能同时拿到索引和值的原生方式,比 forEach((v,i) => {...}) 更适合需要显式迭代控制的场景,比如配合 break 或提前退出:
for (const [i, v] of arr.entries()) {<br> if (v === 'b') {<br> console.log('found at index', i);<br> break;<br> }<br>}

















