Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

ES6 for-of 与可迭代对象

  for-of循环可以用于从一个可迭代的对象(所谓可迭代对象就是拥有@@iterator方法的对象)中遍历迭代结果。于是像数组、字符串等,这些对象就都可以直接使用for-of循环了。而像Arguments这样本身不是可迭代对象的我们也可以将其做成可迭代的再使用。
  下面这个代码请使用Firefox测试 <script>
var i;
console.log("for-of 遍历字符串");
for(i of "abc")
  console.log(i);
console.log("for-of 遍历数组");
for(i of ["d","e","f"])
  console.log(i);
</script>

  实际上这个结果和昨天使用“@@iterator”时是一样的,因为它们的本质相同,for-of 循环也是通过可迭代对象的“@@iterator”来遍历的。对不可迭代对象使用 for-of 就会抛出异常。比如这个测试代码
<script>
(function(a,b,c){
  //arguments["@@iterator"]=Array.prototype["@@iterator"];
  for(var i of arguments)
    console.log(i);
})(1,2,3);
</script>
TypeError: arguments['@@iterator'] is not a function
  由于arguments本身不是可迭代对象,所以此处抛出了异常。但如果去掉代码中注释掉的那句在Firefox上就可以正常执行。把数组原型的“@@iterator”方法借用给这个arguments的话,它就变成了一个可迭代对象。或者我们可以不借用数组原型的方法,自己为其添加一个“@@iterator”,比如 <script>
(function(a,b,c){
  arguments["@@iterator"]=function*(){
    for(var i=0;i<this.length;i++)
      yield this[i];
  };
  for(var i of arguments)
    console.log(i);
})(1,2,3);
</script>

  这同样可以执行,而且结果是正确的。
  到这里,我又想起了DOM中的 TreeWalker 之类的迭代器API,我猜也许它们将来会搞在一起。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^