就是这样一种机制。它是一种接口,为各类不一样的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator 接口,就能够完成遍历操做(即依次处理该数据结构的全部成员)。数组
Iterator 的做用有三个:数据结构
一、是为各类数据结构,提供一个统一的、简便的访问接口;函数
二、是使得数据结构的成员可以按某种次序排列;spa
三、是 ES6 创造了一种新的遍历命令for...of
循环,Iterator 接口主要供for...of
消费。code
示例代码:orm
//迭代器示例
function newIterator(arr) { let index = 0; return { next:()=>{ if(index<arr.length){ return {value:arr[index++]} } return {value:'无数据值'} } } } const nit=newIterator(['第一次','第二次','第三次']); console.log( nit.next().value) console.log( nit.next().value) console.log( nit.next().value) console.log( nit.next().value) console.log( nit.next().value) /** 输出结果 第一次 第二次 第三次 无数据值 无数据值 **/
Symbol.iterator
属性自己是一个函数,就是当前数据结构默认的遍历器生成函数。执行这个函数,就会返回一个遍历器。至于属性名Symbol.iterator
,它是一个表达式,返回Symbol
对象的iterator
属性,这是一个预约义好的、类型为 Symbol 的特殊值,因此要放在方括号内对象
Symbol 是 ES6 引入了一种新的原始数据类型
blogSymbol
,表示独一无二的值
const obj = { [Symbol.iterator] : function () { return { next: function () { return { value: 1, done: true }; } }; } };
生成器函数语法能够理解为对迭代器简化,为了更便捷的使用迭代器而出现的生成器函数。用来达到语法层面的代码精简;接口
Generator 能够看做是数据结构,更确切地说,能够看做是一个数组结构,由于 Generator 函数能够返回一系列的值,这意味着它能够对任意表达式,提供相似数组的接口。部署
示例代码
function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator();
/** 执行结果
hw.next() // { value: 'hello', done: false } hw.next() // { value: 'world', done: false } hw.next() // { value: 'ending', done: true } hw.next() // { value: undefined, done: true }
**/
for...of
循环能够自动遍历 Generator 函数时生成的Iterator
对象,且此时再也不须要调用next
方法。