幾種for對比
忘了來源哪里泡仗,望指出番甩,侵刪
迭代器
- 擁有迭代器的對象我們叫做
iterable
索赏,而迭代器叫做iterator
,這是兩個不同的概念 - 所有擁有
[Symbol.iterator]()
的對象被稱為可迭代的 - 原理:
for-of
循環(huán)首先調(diào)用集合的[Symbol.iterator]()
方法贴彼,緊接著返回一個新的迭代器對象潜腻。迭代器對象可以是任意具有next()
方法的對象;for-of
循環(huán)將重復調(diào)用這個方法器仗,每次循環(huán)調(diào)用一次
原理及實現(xiàn)
- 給對象添加一個名稱為
Symbol.iterator
的屬性方法融涣。Symbol.iterator
是一個內(nèi)置符號,代表一個迭代器方法精钮。 -
Symbol.iterator
這個方法必須返回一個迭代器對象威鹿,包含一個next
方法next()
方法每次執(zhí)行都返回一個結果對象,這個對象有兩個屬性:-
value
轨香,表示將要返回的值忽你; -
done
,是一個布爾值臂容,表示是否進行下次迭代
-
- 迭代器還會保存一個
內(nèi)部指針
科雳,用來指向當前集合中值的位置,每調(diào)用一次next()
方法脓杉,都會返回下一個可用的結果對象糟秘。
var obj = { a: 1, b: 2 };
Object.prototype[Symbol.iterator] = function () {
const keys = Object.keys(this);
let index = 0;
return {
next: () => {
return {
value: this[keys[index++]], // 每次迭代的結果
done: index > keys.length // 迭代結束標識 false停止迭代,true繼續(xù)迭代
};
}
}
}
for (let n of obj) {
console.log(n);
/**
* 1
* 2
*/
}
參考: