for...of
我們知道for...in可以用于遍歷對象屬性名key,而for...of則可以遍歷容器的value。我們通過下面的例子來比較一下:
let arr = [7, 8, 9];
arr.foo = 'James';
for (let i in arr) {
console.log(i); // logs "0", "1", "2", "foo"
}
for (let i of arr) {
console.log(i); // logs 7, 8, 9
}
迭代器
迭代器(iterator)一個是可以用于遍歷容器(如Array等)的對象。迭代器只有一個方法,next()。
next()
next將依次返回容器中的新值{value:xxx, done:false},直到遍歷完畢返回{done:true}
我們來看一下創(chuàng)建一個array的迭代器:
function makeIterator(array) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{done: true};
}
};
}
var it = makeIterator(['David', 'James']);
console.log(it.next().value); // 'David'
console.log(it.next().value); // 'James'
console.log(it.next().done); // true
迭代協(xié)議
for..of 與 for...in 有著本質(zhì)上的不同,隱藏于 for...of 背后的是原理是迭代協(xié)議。
迭代協(xié)議的涵義是,對象的System.iterator屬性應當是一個函數(shù),當調(diào)用后返回一個全新的迭代器。
當用for...of 遍歷一個object時它的工作流程如下:
1、獲取object的System.iterator屬性指向的函數(shù)。
2、調(diào)用該函數(shù),返回值為一個迭代器。
3、調(diào)用迭代器next()方法,得到value、done兩個值。
4、如果done為true,退出循環(huán)。
5、如果值done為false,則將value用于statements中,執(zhí)行for...of循環(huán)體。執(zhí)行完后返回3。
好了,完結(jié)。
什么是生成函數(shù)?