这篇文章只是聊一下iterator
的基础知识, 若是想全面了解iterator
是什么东西, 能够点这es6
阮一峰老师的ES6入门bash
Iterator
是一个提供给各类数据结构访问的统一接口, 简单来讲, iterator
就是一个接口数据结构
使用iterator
主要有三个做用dom
Map,Set,Array,String...
提供一个统一的简便的访问接口next
关键字按顺序访问数据结构的数据for...of
遍历消费 (主要)重点在这 : 全部的遍历器 iterator
都是从名为 [Symbol.iterator]
的接口(方法)开始出发的, 而后调用 next
方法按顺序输出数据ui
上面说到了 [Symbol.iterator]
next
, 那什么是 [Symbol.iterator]
? 什么是 next
?spa
[Symbol.iterator]
[Symbol.iterator]
是启动遍历器的开关, 若是没有这个开关, 就不存在遍历器[Symbol.iterator]
分为先天的和后天的首先, 先天的[Symbol.iterator]
存在在一些特殊的数据结构中, 包括 Array
String
Map
Set
TypedArray
arguments
NodeList(dom)
GeneratorObject
等等, 以下图所示3d
看到没, 就是这个东西, 在我说的那几个数据结构中都有, 不信的能够本身一个一个去试试code
可是, 不知道有没有发现, 咱们最经常使用的 Object
是没有 [Symbol.iterator]
接口的cdn
因此 Object
是不能使用 for...of
进行遍历的对象
Object
有不少方法能够遍历, 可是产品经理就要你用
for ... of
遍历
Object
, 怎么办, 这就要说到后天的
[Symbol.iterator]
var obj = {
[Symbol.iterator] : () => {
return {}
}
}
for (const val of obj) {
console.log(val)
}
复制代码
Object
不是没有 [Symbol.iterator]
方法吗, 咱们本身加一个不就好了
看 ! 如今 obj
是可遍历的了 ( 这里的错误先无论, 后面会说到 )
next
上面说过 iterator
从 [Symbol.iterator]
开始, 经过 next
按顺序输出数据, 因此, 咱们来看一下从 [Symbol.iterator]
出发后的是什么东西
能够很清楚的看到, [Symbol.iterator]
执行后会返回一个包含 next
方法的对象
因此 , next
就是由 [Symbol.iterator]
执行后返回的一个方法, 下面咱们来执行一下next
每次执行 next
都会返回一个对象 {value: xxx, done: xxx}
value
为遍历的数据结构的每一位, done
表示是否完成遍历
如今咱们能够完善一下上面的错误了
var obj = {
[Symbol.iterator] : () => {
return {
next : () => {
const isContinue = (Math.random() > 0.75)
if (isContinue)
return {
value : `数字 ${Math.floor(Math.random() * 10)}`,
done : false
}
return { value : undefined, done : true}
}
}
}
}
for (const val of obj) {
console.log(val)
}
复制代码
ber ~ 这样对象就算没有 [Symbol.iterator]
接口也可使用 for ... of
去遍历了
for ... of
一直在用 for ... of
, 顺带提一嘴, for ... of
是什么玩意
for ... of
是ES6
的一个新遍历的方法, 且只能遍历具备 iterator
接口的数据结构, 也就是要有 [Symbol.iterator]
, 至于这个遍历有什么好处, 你们可自行百度一下
全部的遍历器 iterator
都是从名为 [Symbol.iterator]
的接口(方法)开始出发的, 而后调用 next
方法按顺序输出数据
ber~