针对可迭代对象的Iterator接口,通过遍历器按顺序获取对应的值进行赋值。

1、Iterator 是什么?

Iterator是一种接口,为各种不一样的数据解构提供统一的访问机制。任何数据解构只要有Iterator接口,就能通过遍历操作,依次按顺序处理数据结构内所有成员。ES6中的for of的语法相当于遍历器,会在遍历数据结构时,自动寻找Iterator接口。

2、Iterator有什么用?

  • 为各种数据解构提供统一的访问接口
  • 使得数据解构能按次序排列处理
  • 可以使用ES6最新命令 for of进行遍历

写一个可以迭代的生成器:

  1. function generateIterator(array) {
  2. let nextIndex = 0
  3. return {
  4. next: () => nextIndex < array.length ? {
  5. value: array[nextIndex++],
  6. done: false
  7. } : {
  8. value: undefined,
  9. done: true
  10. }
  11. };
  12. }
  13. const iterator = generateIterator([0, 1, 2])
  14. console.log(iterator.next())
  15. console.log(iterator.next())
  16. console.log(iterator.next())
  17. console.log(iterator.next())

3、可迭代对象是什么?

可迭代对象是Iterator接口的实现。这是ECMAScript 2015的补充,它不是内置或语法,而仅仅是协议。任何遵循该协议点对象都能成为可迭代对象。可迭代对象得有两个协议:可迭代协议和迭代器协议。

  • 可迭代协议:对象必须实现iterator方法。即对象或其原型链上必须有一个名叫Symbol.iterator的属性。该属性的值为无参函数,函数返回迭代器协议。
  • 迭代器协议:定义了标准的方式来产生一个有限或无限序列值。其要求必须实现一个next()方法,该方法返回对象有done(boolean)和value属性。

4、实现一个for of遍历对象

通过以上可知,自定义数据结构,只要拥有Iterator接口,并将其部署到自己的Symbol.iterator属性上,就可以成为可迭代对象,能被for of循环遍历。

  1. const obj = {
  2. count:0,
  3. [Symbol.iterator]: () => {
  4. return {
  5. next: () => {
  6. obj.count++
  7. if (obj.count <= 10) {
  8. return {
  9. value: obj.count,
  10. done: false
  11. }
  12. } else {
  13. return {
  14. value: obj.count,
  15. done: true
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }
  22. console.log(obj[Symbol.iterator]().next())
  23. console.log(obj[Symbol.iterator]().next())
  24. for (const item of obj) {
  25. console.log(item)
  26. }

或者:

  1. const iterable = {
  2. 0: 'a',
  3. 1: 'b',
  4. 2: 'c',
  5. length: 3,
  6. [Symbol.iterator]: Array.prototype[Symbol.iterator],
  7. };
  8. for (const item of iterable) {
  9. console.log(item);
  10. }