1.迭代器是帶有特殊介面的物件
,返回乙個next
方法,該方法中同時又value
和done
屬性,當再沒有值可以迭代時,value
為undefined
,done
為true
,否則value
為當前值,done
為false
2.根據上面的描述實現乙個迭代器,如下:
let iterator =
}};console.log(iterator.next()); //
console.log(iterator.next()); //
console.log(iterator.next()); //
console.log(iterator.next()); //
1.生成器是返回迭代器的函式,如下:
function *createiterator()
let iterator = createiterator();
console.log(iterator.next()); //
console.log(iterator.next()); //
console.log(iterator.next()); //
console.log(iterator.next()); //
2.生成器有幾點要注意的:
1.可迭代型別:指那些包含symbol.iterator
屬性的物件,該屬性定義了返回迭代器的函式(如:陣列,set,map等)
2.for-of迴圈可以迴圈可迭代型別,for-of迴圈會在可迭代型別每次執行後呼叫next()並將結果儲存在變數中,迴圈會持續進行,直到結果物件的done屬性為true
3.for-of迴圈會呼叫陣列的symbol.iterator
屬性來獲取迭代器(該方法由幕後的js引擎呼叫),並將呼叫iterator.next(),並將該結果物件的value屬性的值賦給num,直到done為true,迴圈會退出,num不會被賦給undefined,**如下:
let values = [1, 2, 3];
for (let item of values)
4.對於非可迭代物件,如null
和undefined
,使用for-of迴圈會丟擲錯誤
5.可以在for-of迴圈中使用解構
let map = new map();
map.set('name', 'sxt');
map.set('age', 2);
for(let [key, value] of map)
//輸出:
//name = sxt
//age = 2
6.for-of迴圈可以用於迴圈nodelist
1.可以用symbol.iterator
屬性來訪問物件預設的迭代器,如:
let arr = [6, 7, 8];
let iterator = arr[symbol.iterator]();
console.log(iterator.next()); //
console.log(iterator.next()); //
console.log(iterator.next()); //
console.log(iterator.next()); //
2.判斷乙個物件是否可以迭代,可以通過判斷symbol.iterator
屬性是否是乙個函式來實現,如:
function isiterator(obj)
let arr = [1, 3, 4];
let num = 1;
console.log(isiterator(arr)); //true
console.log(isiterator(num)); //false
3.建立可迭代型別: 我們自己定義的物件預設是不可迭代型別,但是我們可以通過設定symbol.iterator
屬性來使這個物件可以迭代。因為前面第3點有講到,判斷乙個物件是否可以迭代,其實是通過symbol.iterator
屬性來確定的,由此可以建立下面的物件
let obj =
};for (let item of obj)
1.我們平常迭代陣列,set和map時,能拿到迭代的值,是因為這些集合中有內建的迭代器,如
let arr = [1, 3, 5];
let set = new set();
set.add('time');
set.add('user');
set.add('family');
let map = new map();
map.set('name', 'sxt');
map.set('age', 12);
map.set('sister', 'andy');
for(let item of arr)
for(let item of set)
for(let item of map)
2.內建迭代器分為三種
3.陣列的entries返回的是[索引,值]
,set的entries是[值,值]
,因為set的鍵值是一樣的,map的entries是[鍵名,鍵值]
,如:
let arr = [1, 3, 5];
let set = new set();
set.add('time');
set.add('user');
set.add('family');
let map = new map();
map.set('name', 'sxt');
map.set('age', 12);
map.set('sister', 'andy');
for(let item of arr.entries())
for(let item of set.entries())
for(let item of map.entries())
4.陣列的keys返回的索引,set的keys返回的還是值,map的keys返回的是值
5.陣列,set,map的values返回的都是值
1.我們可以向迭代器中傳遞引數
function *createiterator()
let iterator = createiterator();
console.log(iterator.next()); //
console.log(iterator.next(4)); //
console.log(iterator.next(5)); //
console.log(iterator.next()); //
function *createiterator()
let iterator = createiterator();
console.log(iterator.next()); //
console.log(iterator.next(4)); //
console.log(iterator.next(5)); //
console.log(iterator.next()); //
1.即,在乙個生成器中呼叫另外的生成器,有時候,這樣的操作會更加的實用
function *create1()
function *create()
let iterator = create();
console.log(iterator.next()); //
console.log(iterator.next()); //
console.log(iterator.next()); //
console.log(iterator.next()); //
console.log(iterator.next()); //
生成器和迭代器
可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...
迭代器和生成器
1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...
生成器和迭代器
1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...