参考答案:
可迭代对象(Iterable object)是数组的泛化,这个概念是在说任何对象都可以被定制为可在 for..of
循环中使用的对象。
也就是说,可以应用 for..of
的对象被称为 可迭代对象
。
在 JavaScript 中,迭代器是一个对象,它定义一个序列,并在终止时可能返回一个返回值。
更具体地说,迭代器是通过使用 next()
方法实现 Iterator protocol
的任何一个对象,该方法返回具有两个属性的对象:
value
,这是序列中的 next
值done
,如果已经迭代到序列中的最后一个值,则它为 true
如果 value
和 done
一起存在,则它是迭代器的返回值。
一旦创建,迭代器对象可以通过重复调用 next()
显式地迭代。
迭代一个迭代器被称为消耗了这个迭代器,因为它通常只能执行一次。
在产生终止值之后,对 next()
的额外调用应该继续返回 {done: true}
。
Javascript 中最常见的迭代器是 Array 迭代器,它只是按顺序返回关联数组中的每个值。
虽然很容易想象所有迭代器都可以表示为数组,但事实并非如此。数组必须完整分配,但迭代器仅在必要时使用,因此可以表示无限大小的序列,例如 0 和无穷大之间的整数范围。
这是一个可以做到这一点的例子。它允许创建一个简单的范围迭代器,它定义了从开始(包括)到结束(独占)间隔步长的整数序列。它的最终返回值是它创建的序列的大小,由变量 iterationCount 跟踪。
1let index = 0 2const bears = ['ice', 'panda', 'grizzly'] 3 4let iterator = { 5 next() { 6 if (index < bears.length) { 7 return { done: false, value: bears[index++] } 8 } 9 10 return { done: true, value: undefined } 11 } 12} 13 14console.log(iterator.next()) //{ done: false, value: 'ice' } 15console.log(iterator.next()) //{ done: false, value: 'panda' } 16console.log(iterator.next()) //{ done: false, value: 'grizzly' } 17console.log(iterator.next()) //{ done: true, value: undefined }
如果一个对象拥有 [Symbol.iterator]
方法,并且该方法返回一个迭代器对象,这样的对象即可称为可迭代对象
。
1let info = { 2 bears: ['ice', 'panda', 'grizzly'], 3 [Symbol.iterator]: function() { 4 let index = 0 5 let _iterator = { 6 //这里一定要箭头函数,或者手动保存上层作用域的this 7 next: () => { 8 if (index < this.bears.length) { 9 return { done: false, value: this.bears[index++] } 10 } 11 12 return { done: true, value: undefined } 13 } 14 } 15 16 return _iterator 17 } 18} 19 20let iter = info[Symbol.iterator]() 21console.log(iter.next()) 22console.log(iter.next()) 23console.log(iter.next()) 24console.log(iter.next()) 25 26//符合可迭代对象协议 就可以利用 for of 遍历 27for (let bear of info) { 28 console.log(bear) 29} 30//ice panda grizzly
最近更新时间:2024-08-10