// 有限迭代器function createArrayIterator(arr) {let index = 0;return {next() {if (index < arr.length) {return { done: false, value: arr[index++] }}return { done: true, value: undefined }}}}const names = ['a', 'b']const nums = [1, 2]const namesIterator = createArrayIterator(names);const numsIterator = createArrayIterator(nums);console.log(namesIterator.next());console.log(namesIterator.next());console.log(namesIterator.next());console.log(namesIterator.next());console.log(numsIterator.next());console.log(numsIterator.next());console.log(numsIterator.next());console.log(numsIterator.next());// 无限迭代器function createInfiniteArrayIterator() {let index = 0;return {next() {return { done: false, value: index++ }}}}const infiniteArrayIterator = createInfiniteArrayIterator();console.log(infiniteArrayIterator.next());console.log(infiniteArrayIterator.next());console.log(infiniteArrayIterator.next());console.log(infiniteArrayIterator.next());
// 创建可迭代对象(什么是可迭代对象?)const iteratorObj = {names: ['a', 'b', 'c'],[Symbol.iterator]: function () {let index = 0;return {next: () => {if (index < this.names.length) {return { done: false, value: this.names[index++] }}return { done: true, value: undefined }}}}}const iterator = iteratorObj[Symbol.iterator]();console.log(iterator.next());console.log(iterator.next());console.log(iterator.next());console.log(iterator.next());console.log(iterator.next());// 此时iteratorObj是一个可迭代对象,像for of遍历的是一个可迭代对象,如果是普通对象({a: 1}),使用for of进行遍历时会报错for (const item of iteratorObj) {// 1. 输出的值其实是iterator.next().value// 2. 当done为true时, 停止遍历, 因此item的值只会输出a,b,cconsole.log(item);}