迭代器和生成器区别
2021-08-24 本文已影响0人
AAA前端
迭代器
迭代器是一种特殊对象,它具有一些专门为迭代过程设计的专有接口, 所有的迭代对象都有一个next 方法, 每次调用都返回一个结果对象。结果对象有两个属性:
- 一个是value,表示下一个将要返回的值
- 另一个是done, 布尔值,表示没有更多数据时返回true.
迭代器还会保存一个内部指针,用来指向当前集合中值的位置,每次调用一次next()方法,都会返回下一个可用的值。
生成器
生成器是一种返回迭代器的函数,通过function关键字后的星号(*)来表示,函数中会用到新的 关键字 yield.星号可以紧挨着function关键字,也可以在中间添加空格。
function *createIterator(){
yield 1;
yield 2;
yield 3;
}
let iterator = createIterator();
console.log(iterator.next().value); //1
console.log(iterator.next().value); //2
console.log(iterator.next().value); //3
生成器的调用方式与普通函数相同,只不过返回的是一个迭代器。
yield关键字值可在生成器内部使用,在其他地方使用会导致程序抛出语法错误,几遍在生成器内部的函数中使用也会报错。
可迭代对象和for-of循环
可迭代对象具有Symbol.iterator属性,是一种与迭代器密切相关的对象。Symbol.iterator通过指定的函数可以返回一个作用于附属对象的迭代器。
ES6中,所有的集合对象(数组,对象,Set集合,Map集合)和字符串都是可迭代对象,这些对象都有默认的迭代器。 ECMAScript中新加入的特性for-of循环需要用到迭代器对象的这些功能。
内建迭代器
ES6中已经默认为许多内建类型提供了内建迭代器,只有当这些内建迭代器无法实现你的目标时才需要自己创建,通常是自定义的对象和类时,才会遇到这种情况。
集合对象迭代器
ES6中有3中类型的集合对象:数组、Map集合,Set集合。为了更好的访问对象中的内容,这三种对象都内建了三种迭代器:
- entries() 返回一个迭代器,其值为多个键值对
- values() 返回一个地打起,其值为集合在值
- keys() 返回一个迭代器,其值为集合中的所有键名
参考:深入理解ES6