在ES6 Map上使用for..of循环

saa*_*adq 10 javascript dictionary ecmascript-6

我正在阅读这个for.. of在Map上使用循环的例子,我对这种语法有点困惑:

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");

for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}
Run Code Online (Sandbox Code Playgroud)

具体来说,我不明白正在发生的数组解构.我知道你可以使用数组解构来做类似的事情let [one, two] = [1, 2];,但是这个例子中发生了什么?myMap这不是一个数组,为什么这会得到正确的值?

我的另一个问题是为什么是key, value解构中的订单,但是当你执行forEach()订单时value, key,就像这里:

myMap.forEach((value, key) => {
  console.log(key + " = " + value);
});
Run Code Online (Sandbox Code Playgroud)

Ry-*_*Ry- 24

for (var [key, value] of myMap) {
    console.log(key + " = " + value);
}
Run Code Online (Sandbox Code Playgroud)

就好像

for (let pair of myMap) {
    var [key, value] = pair;
    console.log(key + " = " + value);
}
Run Code Online (Sandbox Code Playgroud)

所以它不一定myMap是一个解构工作的阵列; 相反,它的每个元素在迭代时必须是一个数组,迭代映射确实产生数组(键/值对).

Map#forEach的参数顺序可能与for一致Array#forEach,它使用参数调用函数(item, index); 反过来,它可能会这样做,因为你并不总是需要索引.


Ale*_*lls 5

稍微偏离主题,但顺便说一句:

myMap.forEach((v,k) => {});
Run Code Online (Sandbox Code Playgroud)

比性能高出约 50%

for (var [key, value] of myMap) {

}
Run Code Online (Sandbox Code Playgroud)

所以也许可以考虑使用Map.prototype.forEach(不要与 混淆Array.prototype.forEach)。

  • 不是依赖JS引擎吗?到了2021年,情况仍然如此吗?听起来像是不成熟的微优化。 (3认同)
  • 使用 .forEach 等待异步调用也很困难,但使用 for ... of 可以开箱即用 (3认同)
  • 性能优势的来源?我记得 `for of` 总是比 `forEach()` 快? (2认同)