当前位置:网站首页>es6对象迭代器iterator

es6对象迭代器iterator

2022-08-09 11:09:00 一头小驴

非原创,只是从相关教程拉取代码解析。深入了解一门语言之后,你会发现前端水很深。菜鸟一枚,共同成长

http://caibaojian.com/es6/iterator.html

//Obj对象 形成的集合链可以被 for...of 遍历,of指向链上的第一个对象,使用next指向下一个对象
function Obj(value) {
  this.value = value;
  this.next = null;
}
//注意,迭代器函数返回的是 当前对象的 遍历器对象(而且一定会包含一个名为next的方法,调用该对象的next方法,
在返回一个值的同时,自动将内部指针移到下一个实例)。
Obj.prototype[Symbol.iterator] = function() {
    
  var current = this;  //定位到当前Obj的实例对象
    
  console.log(current instanceof Obj); //返回true ,说明this指向Obj实例
  console.log(current.__proto__ === Obj.prototype)
  
  var iterator = {
    next: function next() {
        if (current !==null) { //链上的最后一个对象的next =null,就可以直接指定done:
          var value = current.value;
          current = current.next;
          return {done: false,value: value};
      } 
      else {
          return {done: true};
      }
  },
}

return iterator;
}

var one = new Obj(1);
var two = new Obj(2);
var three = new Obj(3);

one.next = two;
two.next = three;

for (var i of one){
  console.log(i);
}
// 1
// 2
// 3

上面是一个对象集合的遍历,你需要手动指定下一个对象。next属性指向下一个链接对象。

如下是针对数组遍历的例子。

var it = makeIterator(['a', 'b']);

it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }

function makeIterator(array) {
  var nextIndex = 0;
  return {
    next: function() {
      return nextIndex < array.length ?
        {value: array[nextIndex++], done: false} :
        {value: undefined, done: true};
    }
  };
}
原网站

版权声明
本文为[一头小驴]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_37326058/article/details/105093160