entries()返回array iterator对象,每次调用next()返回{value: [index, element], done: false};其value为二元数组,支持for...of解构[index, value],不可用对象解构。

entries() 返回的是什么类型的迭代器
Array.prototype.entries() 返回一个数组迭代器对象,每次调用 next() 会返回形如 { value: [index, element], done: false } 的对象。注意:它的 value 是一个长度为 2 的数组,不是对象,也不是 Map 项 —— 这点容易误以为能直接解构出 { index, value }。
for...of 中正确解构索引和值的写法
必须用数组解构语法,因为 entries() 每次产出的是 [index, element] 这样的二元数组:
const arr = ['a', 'b', 'c'];
for (const [index, value] of arr.entries()) {
console.log(index, value); // 0 'a' → 1 'b' → 2 'c'
}
常见错误写法包括:
- 写成
for (const { index, value } of arr.entries())—— 报错,因为返回值不是对象 - 写成
for (const item of arr.entries())然后手动取item[0]和item[1]—— 可行但冗余,失去解构意义 - 在
map()或forEach()中误传arr.entries()—— 它们不接受迭代器,只接受数组或类数组
entries() 和 for...in / forEach / map 的关键区别
entries() 是唯一原生支持「同时、简洁、不可变地」拿到索引与值的数组方法。对比其他方式:
-
for...in遍历的是属性名(包括原型链上的可枚举属性),不保证顺序,且可能遍历到非数字键 -
forEach((value, index) => {...})虽然也提供索引,但无法中途break或return终止遍历 -
map()强制返回新数组,若只是想读取并处理,属于额外开销 -
entries()返回的迭代器可被多次使用(只要没耗尽)、可与Array.from()或展开运算符结合,比如[...arr.entries()]得到完整索引-值对数组
兼容性与替代方案(IE 不支持时怎么办)
entries() 在 IE 中完全不支持,Node.js 从 v0.12+ 开始支持,现代浏览器均无问题。如果需兼容 IE,不要试图 polyfill 迭代器协议(太重),改用传统 for 循环更实际:
const arr = ['x', 'y'];
for (let i = 0; i
<p>或者封装一个轻量函数:</p>
<pre class="brush:php;toolbar:false;">function entries(arr) {
return Array.from(arr, (value, index) => [index, value]);
}
// 用法同 [...entries(arr)] 或 for...of entries(arr)
注意:Array.from() 本身在 IE 中也不支持,所以真要全兼容,还是老老实实写 for 循环最稳。










