迭代器和生成器

2021-09-13 12:43:17 字數 4244 閱讀 7145

1.迭代器是帶有特殊介面的物件,返回乙個next方法,該方法中同時又valuedone屬性,當再沒有值可以迭代時,valueundefineddonetrue,否則value為當前值,donefalse

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.對於非可迭代物件,如nullundefined,使用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...