首先了解一下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
}
}
}
上述是個(gè)類似遍歷器,但不真是個(gè)遍歷器,遍歷器是可以用for...of 進(jìn)行遍歷,有Symbol.iterator屬性作為key,這個(gè)key指向遍歷器生成函數(shù),有這個(gè)屬性才被認(rèn)為是可遍歷的
var obj = {
[Symbol.iterator]: function() { // 遍歷器生成函數(shù)
return {
next: function() {
return {value:..., done:false}
}
}
}
}
此時(shí)obj內(nèi)置了一個(gè)遍歷器,可以for...of進(jìn)行遍歷,原生支持內(nèi)置了遍歷器的數(shù)據(jù)類型有Array,Map,Set,String,函數(shù)參數(shù)arguments, nodeList...
遍歷器使用場景,
Array.from
[...arr]
var [a, b] = arr 結(jié)構(gòu)賦值
yield
簡述yield
遍歷器生成函數(shù)結(jié)構(gòu)為
function () {
return {
next: function() {
return {value: xxx, done:false}
}
}
}
用generator來寫就是
function* () {
yield 1
yield 2
yield 3
}
這個(gè)函數(shù)就是遍歷器生成函數(shù)
將遍歷器生成函數(shù)賦值給對(duì)象的[Symbol.iterator],就可以用for-of進(jìn)行對(duì)象屬性的遍歷