Iterator
Iteratior是一个可迭代对象,而for of迭代所有课迭代对象(Array, Map, Set, String, TypedArray, arguments objects等)。在JavaScript中,一个迭代器会提供一个返回序列中下一项的next()方法,该方法返回一个拥有done和value属性的对象。
1 | let fibonacci = { |
注意这里创建的fibonacci对象中的[Symbol.iterator]属性,Symbol是ES6中新增的一种原始数据类型,该类型代表一个对无二的值;Symbol.iterator也是一个独一无二的值,当我们用for of去循环访问一个对象时,for of会去访问该对象的Symbol.iterator属性,该属性应该是一个对象,该对象应该有一个next()方法,next()方法经过相应逻辑处理后应该返回一个含有value和done的对象,value就是当前循环时的返回值,done表示整个循环是否结束。
for of
Map和Set是内置可迭代的,因为Map和Set的prototype都含有[Symbol.iterator]属性。
迭代Map。
1 | let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]); |
迭代Set。
1 | let iterable = new Set([1, 1, 2, 2, 3, 3]); |
生成器对象和生成器函数
生成器对象(Generator objects)由生成器函数(Generator function)返回。其遵从iterable协议和iterator协议。
注意生成器函数的定义形式,function关键字后面必须加*号;生成器会按照逻辑逐次生产出一个值,当一个生成器产出完所有值之后,再次尝试获取时将得到undefined。
1 | function* gen() { |
使用for of迭代生成器。
1 | function* fibonacci() { // 生成器函数 |
关于生成器的内容,我们将在下一篇总结中进行更深一步的探讨。
知识点总结
- 生成器函数和生成器对象的基本使用;
- for of迭代一切可迭代对象。