=====================迭代器=========================
背景知識:
1. 什麼是迭代?
從一個數據集合中按照一定的順序,不斷取出數據的過程
2. 迭代和遍歷的區別?
迭代強調的是依次取數據,並不保證取多少,也不保證把所有的數據取完
遍歷強調的是要把整個數據依次全部取出
3. 迭代器
對迭代過程的封裝,在不同語言中有不同的表現形式,通常爲對象
4. 迭代模式
一種設計模式,用於同一迭代過程,並規範了迭代器規格:
迭代器應該具有得到下一個數據的能力
迭代器應該具有判斷是否還有後續數據的能力
JS中的迭代器
JS規定,如果一個對象具有next方法,並且 該方法返回一個對象,該對象的格式如下:
{value: 值, done: 是否迭代完成}
例如:
const obj = {
next() {
return { value: xxx, done: xxx }
}
}
則認爲該對象是一個迭代器
next() 含義:
next方法:用於得到下一個數據
返回的對象:
value: 下一個數據的值
done: boolean,是否迭代完成
例如: 數組的迭代器:
// 迭代器創建函數
function createIterator(arr) {
const iterator = {
i: 0,
next() {
let result = {
value: arr[this.i],
hasDone: this.i >= arr.length,
}
this.i++;
return result;
}
}
return iterator;
}
const arr = [1, 2, 3, 4, 5];
const result = createIterator(arr);
可迭代協議
es6規定,如果一個對象具有知名符號屬性: Symbol.iterator, 並且屬性值是一個迭代器創建函數,
則該對象是可迭代的(iterator)
例如:
const obj = {
[Symbol.iterator]() {
return {
next() {
return {
value: 1,
hasDone: false,
}
}
}
}
}
如何判斷一個對象是否可以迭代: 通過原型上去找是否含有 [Symbol.iterator] 知名符號屬性的方法
es6中數組,已經做成了一個可迭代的對象:
例如:
const arr = [1,2,3,4,5,6];
connst iterator = arr[Symbol.iterator]();
iterator.next(); 可以一直執行
dom中的許多類數組也是一個可迭代的對象:
如何遍歷迭代器:
const arr = [1,2,3,4,5,6];
connst iterator = arr[Symbol.iterator]();
let result = iterator.next();
while(!result.done){
const item = result.value;
console.log(item) // 此處可以輸出所有的迭代器裏面的結果
result = iterator.next();
}
es6 爲了統一迭代方法: 提出了for of 循環
for of 循環用於遍歷可迭代對象, 格式如下:
for(const item in iterable){
// iterable 可迭代對象
// item: 每一次迭代得到的數據
}
for(const item of arr){
console.log(item)// 等價於上面的while循環去調用next()方法
}
展開運算符與可迭代對象: 展開運算符可以作用與迭代對象,這樣,就可以輕鬆的將可迭代對象轉換爲數組
es6 iterator 迭代器的學習總結
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.