Appearance
iterator
迭代器解决了什么问题?
- 简化多层 for 循环引用(出自理解 es6 第八章)
迭代器(iterator)是什么
- 迭代器具有 next 方法的特殊对象
- 特殊对象调用 next 方法会返回一个结果对象
- 结果对象包含
value,done
两个属性- value 代表特殊对象的迭代值
- done 表示特殊对象是否迭代完成
- 当特殊对象调用 next 到最后一个值后,继续调用 next,返回的结果对象为
- value 是 next 函数默认的 return 值
- done 为 true
基于上述规则可实现一个迭代器函数,将数组转换为迭代器。
生成器(generator)
es6 提供生成器语法避免手动创建迭代器的复杂性。
js
// 1. 在函数关键字后加上 * 申名函数为迭代器
function * iteratorDemo() {
// 2. 采用 yield 语法申名每次 next 返回的内容
yield 1
yield 2
}
*
, function 关键字后的星号指明为迭代器函数yield
, 函数体中的yield
关键字指明每个 next 的返回内容
yield
yield 关键字可用于,值和表达式之前。可以在语句内部使用该关键字。 采用迭代器语法,修改数组转换为迭代启动方法。
js
function * iteratorArr(arr) {
for(let i =0;i++;i< arr.length) {
yield arr[i]
}
}
注意 yield 的所属的函数体必须为生成器函数,无法用于其他函数体内部。
由于生成器是一个函数,可采用函数表达式声明生成器,也可在 对象内部,采用简写模式直接申名。
js
// 函数表达式创建生成器
const iteratorArr = function * iteratorArr(arr) {
for(let i =0;i++;i< arr.length) {
yield arr[i]
}
}
// 对象内部采用简写申名生成器
let obj = {
// 生成器
*iterator {
}
}
注意箭头函数不支持生成器语法
知识点
- 迭代器概述,循环集合时需要额外参数记录循环位置的问题,同时提供了暂停执行能力,提供了程序控制的更多可能性
- 迭代器协议
- 利用 next 触发迭代,返回结果为
value,done
的对象
- 利用 next 触发迭代,返回结果为
- 可迭代协议,可采用
for of
循环结果,同时支持对象扩展语法Symbol.iterator
内建属性定义迭代器,可采用Symbol.iterator
判断是否可迭代- 内建的可迭代对象
array,set,map,string
支持迭代器- 字符串按照字符而非码元返回值
- 数组,set 返回 value
- 数组
for in
循环会迭代所有属性,而 keys 只返回数值索引 - Map
for, of
返回 value 为 [key,value] - nodeList 为可迭代对象
- 返回可迭代对象的内建函数
entries
迭代器返回的 value 为 [key,value] 索引- 对于 Set 集合 key 值就是 value
values
迭代器返回 value 为值的迭代器keys
迭代器返回 value 为键的迭代器,对于 set 键为值
for await (for of)
异步迭代,可采用Symbol.asyncIterator
迭代- iterator 可使用
...