深入理解es6学习笔记(四)迭代器和生成器

105 阅读2分钟

一、迭代器生成器--是什么

1.迭代器

  • 特殊对象,具有一些专门为迭代过程设计的专有接口
  • 迭代器对象都有一个next()方法,调用返回对象有两个属性value(下一个要返回的值)和done(没有更多可返回数据时返回true)
  • 迭代器还会保存一个内部指针,每调用一次next()方法都会返回下一个可用的值

2.生成器

返回迭代器的函数,通过function关键字后的(*)表示,会用到关键字yield
每执行完一条yield语句函数会自动停止

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的使用限制--只能在生成器内部使用

function *createIterator(items){
    items.forEach(function(){
        // 语法错误
        yield item + 1
    })
}

这里表面看是在生成器内部,但是它与return关键字一样,二者不能穿透函数边界。嵌套函数的中的return语句不能作为外部函数的返回语句,此处嵌套函数中的yield会导致程序抛出语法错误。

1.生成器函数表达式

在function关键字和小括号中间添加*。不能用箭头函数创建生成器

2.生成器对象的方法

在函数名前加*

二、可迭代对象和for-of循环

可迭代对象具有Symbol.iterator属性。生成器默认会为Symbol.iterator属性赋值,通过生成器创建的迭代器都是可迭代对象。
for-of循环每次执行循环都会调用可迭代对象的next()方法,并将迭代器返回对象中的value存储。

1.访问默认迭代器

可以用Symbol.iterator访问对象默认的迭代器。可用它检测对象是否为可迭代对象

2.创建可迭代对象

默认情况下,开发者定义的对象都是不可迭代对象,如果给Symbol.iterator属性添加一个生成器,可以变成可迭代对象。

let collection = {
    items:[],
    *[Symbol.iterator](){
        for(let item of this.items){
            yield item
        }
    }
}
collection.items.push(1)
collection.items.push(2)
collection.items.push(3)
for(let x of collection){
    console.log(x)
}

三、内建迭代器

将可迭代对象转换为数组,展开运算符是最简单的方法

1.集合对象迭代器

数组、Map集合、Set集合内建了以下三种迭代器

  • entries() 返回一个迭代器其值为多个键值对
  • values() 返回一个迭代器其值为集合的值
  • keys() 返回一个迭代器其值为所有的键名 在for-of循环中没有显示指定则使用默认迭代器,数组和Set默认迭代器是values(),Map默认迭代器是entries()

2.字符串迭代器

用for-of的默认迭代器,使其操作字符而不是编码单元

3.NodeList迭代器

DOM标准中有一个NodeList类型代表页面文档的所有元素集合。DOM定义中的NodeList类型默认迭代器与数组的默认迭代器一致。

四、高级迭代器功能(待完善)