首先了解一下iterator遍历器
var a = makeIterator([1,2,3])
a.next() // {value: 1, done: false}
a.next() // {value: 2, done: false}
a.next() // {value: 3, done: false}
a.next() // {value: undefined, done: true}
function makeIterator(arr) {
var index = 0
return {
next: function() {
var item = {
value: arr[index], done: arr.length === index+1 ? true : false
}
index++
return item
}
}
}
上述是个类似遍历器,但不真是个遍历器,遍历器是可以用for...of 进行遍历,有Symbol.iterator属性作为key,这个key指向遍历器生成函数,有这个属性才被认为是可遍历的
var obj = {
[Symbol.iterator]: function() { // 遍历器生成函数
return {
next: function() {
return {value:..., done:false}
}
}
}
}
此时obj内置了一个遍历器,可以for...of进行遍历,原生支持内置了遍历器的数据类型有Array,Map,Set,String,函数参数arguments, nodeList...
遍历器使用场景,
Array.from
[...arr]
var [a, b] = arr 结构赋值
yield
简述yield
遍历器生成函数结构为
function () {
return {
next: function() {
return {value: xxx, done:false}
}
}
}
用generator来写就是
function* () {
yield 1
yield 2
yield 3
}
这个函数就是遍历器生成函数
将遍历器生成函数赋值给对象的[Symbol.iterator],就可以用for-of进行对象属性的遍历