【问题标题】:Proper consumption of iterator without using for...of在不使用 for...of 的情况下正确使用迭代器
【发布时间】:2018-04-01 23:23:43
【问题描述】:

我正在使用URLSearchParams,它将返回一个迭代器对象,但在 IE 中不受支持。我添加了polyfill,但现在 IE 没有对返回的iterator object 的任何原生支持,因为它没有实现for...of 语法。

在没有for..of 的情况下调用迭代器对象的首选语法是什么?

这是 ES6 for...of 语法:

var paramsString = "Name=Fiona&Type=Hippo";
var urlParams = new URLSearchParams(paramsString);
var entries = urlParams.entries();

for(pair of entries) { 
  console.log(pair[0], pair[1]); 
}

var paramsString = "Name=Fiona&Type=Hippo";
var urlParams = new URLSearchParams(paramsString);
var entries = urlParams.entries();

for(pair of entries) { 
  console.log(pair[0] + ": " + pair[1]); 
}
<script src="https://cdn.rawgit.com/WebReflection/url-search-params/v0.10.0/build/url-search-params.js"></script>

我很想找到一个规范的源代码,它将迭代器对象的调用语法实现回旧版浏览器,而不依赖于转译 for...of

【问题讨论】:

标签: javascript loops iterator


【解决方案1】:

为什么不是好老forEach

console.log(urlParams); 表明返回的对象具有 forEach 方法,但令人惊讶的是,MDN 中的方法中没有提到它

urlParams.forEach(function(value, key){ 
    console.log(key + ' : ' + value)
});

var paramsString = "Name=Fiona&Type=Hippo";
var urlParams = new URLSearchParams(paramsString);

urlParams.forEach(function(value, key){ 
  console.log(key + ' : ' + value)
});

每个浏览器中UrlSearchParams的Proto Methods:

【讨论】:

    【解决方案2】:

    如果你对while(true)感到紧张,你可以试试这个:

    var paramsString = "Name=Fiona&Type=Hippo";
    var urlParams = new URLSearchParams(paramsString);
    var entries = urlParams.entries();
    var iterator = entries.next();
    while(!iterator.done) {  
      if (iterator.value) {
    console.log(iterator.value[0] + ": " +
                iterator.value[1])
      }
      iterator=entries.next();
    }
    <script src="https://cdn.rawgit.com/WebReflection/url-search-params/v0.10.0/build/url-search-params.js"></script>

    【讨论】:

      【解决方案3】:

      我不完全确定您的限制是什么,但您也可以在您的 entries 变量上使用 spread operator,如果您可以使用的话。

      var paramsString = "Name=Fiona&Type=Hippo";
      var urlParams = new URLSearchParams(paramsString);
      var entries = [...urlParams.entries()]; // Use spread operator here
      
      // Now entries is just an array with all the normal array methods on it.
      entries.forEach(pair => console.log(pair[0], pair[1]));
      

      【讨论】:

      • 好主意,虽然很可能不支持 for..of 的相同实例也不会支持其他 ES6 运算符,例如 spread,因此您可以使用任何一种方式进行编译。这是browser compatibility tables for both operators,在这两种情况下都不支持 IE。虽然传播的一个很酷的潜在用例。
      【解决方案4】:

      这是我对迭代器实现的尝试,但while(true) 让我感到紧张。欢迎任何其他来源/实现。

      var paramsString = "Name=Fiona&Type=Hippo";
      var urlParams = new URLSearchParams(paramsString);
      var entries = urlParams.entries();
      
      while(true) {
        var iterator = entries.next()
        if (iterator.value) {
          console.log(iterator.value[0] + ": " +
                      iterator.value[1])
        }
        if (iterator.done) {
          break;
        }
      }
      <script src="https://cdn.rawgit.com/WebReflection/url-search-params/v0.10.0/build/url-search-params.js"></script>

      【讨论】:

      • 该代码具有误导性,因为它实际上循环了 3 次。iterator.done 在下一次最后一个元素之后变为true。由于if (iterator.value),它只是不打印第三次。但是当迭代器包含 null、undefined、0、false 等值时,也不会打印。 if (iterator.done) 应该在 entries.next() 之后,if (iterator.value) 不是必需的
      猜你喜欢
      • 2020-02-26
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 2011-04-16
      • 2020-10-14
      相关资源
      最近更新 更多