【问题标题】:Using for..of loop on ES6 Map在 ES6 Map 上使用 for..of 循环
【发布时间】:2016-03-27 05:03:50
【问题描述】:

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

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

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

具体来说,我不明白正在发生的数组解构。我知道您可以使用数组解构来执行类似let [one, two] = [1, 2]; 的操作,但是这个示例中发生了什么? myMap 不是数组,为什么它会得到正确的值?

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

myMap.forEach((value, key) => {
  console.log(key + " = " + value);
});

【问题讨论】:

    标签: javascript dictionary ecmascript-6


    【解决方案1】:
    for (var [key, value] of myMap) {
        console.log(key + " = " + value);
    }
    

    就像

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

    所以不是myMap 必须是一个数组才能进行解构工作;相反,它的每个元素在迭代时都必须是一个数组,而对 map 的迭代确实会产生数组(键/值对)。

    Map#forEach 的参数顺序可能是为了与Array#forEach 保持一致,后者调用带有参数(item, index) 的函数;反过来,它可能会这样做,因为您并不总是需要索引。

    【讨论】:

      【解决方案2】:

      myMap 不是数组,为什么它会得到正确的值?

      Map 的原型有一个[Symbol.iterator] 属性,这意味着 Map 的实例实现了iterator contract

      for of 循环利用迭代器来循环对象。

      换句话说,for of 循环不需要数组,它们需要可迭代对象。数组只是可迭代的一种类型,映射是另一种类型。

      在映射的情况下,迭代器为每次迭代生成一个由键和值组成的 2 元素数组。它还具有其他方法,可让您仅迭代键或值。

      【讨论】:

        【解决方案3】:

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

        myMap.forEach((v,k) => {});
        

        性能比

        高出约 50%
        for (var [key, value] of myMap) {
        
        }
        

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

        【讨论】:

        • 不依赖JS引擎吗? 2021年仍然如此吗?听起来像是过早的微优化。
        【解决方案4】:

        所有,请允许我补充一下所要求的语法是如何工作的。

        Map.entries() 方法返回一个新的 Iterator 对象,其中包含按插入顺序排列的 Map 对象中每个元素的 [key, value] 对。

        for (var [key, value] of myMap.entries) {
          console.log(key + " = " + value);
        }
        

        但是在你的问题中你没有添加 .entries 但它仍然有效。原因是 symbol.Iterator 默认指向 Map.prototype.entries() 函数。这就是您包含或排除它的原因。如上所述,.entries() 函数返回一个数组迭代器([key,value] 对)。

        【讨论】:

        • Map#entries 方法不返回数组。它返回一个生成键值对的迭代器,可以通过for…of 使用。你也忘了打电话给entries
        • 感谢更正,在解释的顶部,我已经清楚地写了它返回一个迭代器。我也编辑了以下声明。请求您投票支持我,因为我的回复在讨论中丢失并且是一个增值。
        猜你喜欢
        • 2020-07-10
        • 1970-01-01
        • 2016-03-24
        • 1970-01-01
        • 2015-07-05
        • 1970-01-01
        • 2018-11-14
        • 1970-01-01
        相关资源
        最近更新 更多