ES6: Iterator

111 阅读1分钟

Iterator简记

iterator遍历器是一种机制(接口):为各种不同的数据结构提供统一的访问机制,任何数据结构只要部署iterator接口,就可以完成遍历操作,一次处理该数据结构的所有成员

特点:

拥有next方法用于依次遍历数据结构的成员
每一次遍历返回的结果是一个对象{done: false,value:xxx}
done:记录是否遍历完成
value:当前遍历的结果

原理: 拥有Symbol.iterator属性的数据结构(值),被称为可被遍历的,可以基于 for of (for of 内部是按照iterator.next去迭代) 循环处理:

  • 数组

  • 部分类数组: arguments/nodeList/htmlCollection...

  • String

  • Set

  • Map

  • generator object... 对象默认不具备Symbol.iterator,所以属于不可被遍历的数据结构

iterator实现

class Iterator {

constructor(assemble) {

let self = this;

self.assemble = assemble;

self.index = 0;

}

next() {

let self = this,

assemble = self.assemble,

index = self.index;

if (index > assemble.length - 1) return {

done: true,

value: undefined

}

return {

done: false,

value: assemble[self.index++]

}

}

}

let iter = new Iterator([1, 2, 3, 4, 5, 6]);

console.log(iter.next());

console.log(iter.next())

console.log(iter.next())

console.log(iter.next())

console.log(iter.next())

console.log(iter.next())

console.log(iter.next())

console.log(iter.next())

let arr = [10, 20, 30, 40];

for (let item of arr) {

// for of 内部是按照iterator.next去迭代,

//只有具备[Symbol.iterator]属性才能用for of 遍历

console.log('for of:', item)

}

对于对象可以自己自定义Symbol.iterator属性,或者直接为Symbol.iterator属性引用Array.prototype[Symbol.iterator]

let obj2 = {

0: 10,

1: 20,

2: 30,

3: 40,

length: 4,

// 1

// [Symbol.iterator]: Array.prototype[Symbol.iterator]

// 2

[Symbol.iterator]: function() {

return new Iterator(this)

}

}

console.log(obj2)

for (let item2 of obj2) {

console.log('obj:', item2)

}