В този урок ще научите за итераторите на JavaScript и итерациите с помощта на примери.
JavaScript Iterables и итератори
JavaScript предоставя протокол за итерация върху структури от данни. Този протокол дефинира как тези структури от данни се итерират при използване на for… of
цикъла.
Концепцията на протокола може да бъде разделена на:
- итеративен
- итератор
Итерируемият протокол споменава, че итерируемият трябва да има Symbol.iterator
ключа.
JavaScript Iterables
Структурите на данни, които имат Symbol.iterator()
метода, се наричат итерабилни. Например масиви, низове, комплекти и др.
JavaScript итератори
Итераторът е обект, който се връща от Symbol.iterator()
метода.
Протоколът итератор предоставя next()
метода за достъп до всеки елемент от итерируемия (структура на данни) един по един.
Нека да разгледаме пример за итерации Symbol.Iterator()
const arr = (1, 2 ,3); // calling the Symbol.iterator() method const arrIterator = arr(Symbol.iterator)(); // gives Array Iterator console.log(arrIterator); const str = 'hello'; // calling the Symbol.iterator() method const strIterator = str(Symbol.iterator)(); // gives String Iterator console.log(strIterator);
Изход
Array Iterator () StringIterator ()
Тук извикването на Symbol.iterator()
метода на масива и низа връща съответните им итератори.
Итерация чрез Iterables
Можете да използвате for… of
цикъла, за да прегледате тези итерируеми обекти. Можете да прегледате Symbol.iterator()
метода по следния начин:
const number = ( 1, 2, 3); for (let n of number(Symbol.iterator)()) ( console.log(n); )
Изход
1 2 3
Или можете просто да прегледате масива по следния начин:
const number = ( 1, 2, 3); for (let n of number) ( console.log(n); )
Тук итераторът позволява на for… of
цикъла да итерира масив и да връща всяка стойност.
JavaScript next () Метод
Обектът на итератор има next()
метод, който връща следващия елемент в последователността.
В next()
метода съдържа две свойства: value
а done
.
- стойност
наvalue
имота може да бъде от всеки тип данни и представлява текущата стойност в последователността. - направено
наdone
имота е булева стойност, която показва дали итерация е пълна или не. Ако итерацията е непълна,done
свойството е настроено наfalse
, в противен случай е зададено наtrue
.
Нека да разгледаме пример за итеративни масиви:
const arr = ('h', 'e', 'l', 'l', 'o'); let arrIterator = arr(Symbol.iterator)(); console.log(arrIterator.next()); // (value: "h", done: false) console.log(arrIterator.next()); // (value: "e", done: false) console.log(arrIterator.next()); // (value: "l", done: false) console.log(arrIterator.next()); // (value: "l", done: false) console.log(arrIterator.next()); // (value: "o", done: false) console.log(arrIterator.next()); // (value: undefined, done: true)
Можете да се обаждате next()
многократно, за да итерирате върху arrIterator
обект.
- В
next()
метода връща обект с две свойства:value
аdone
. - Когато
next()
методът достигне края на последователността, тогаваdone
свойството се задава наfalse
.
Нека да разгледаме как for… of
цикълът изпълнява горната програма. Например,
const arr = ('h', 'e', 'l', 'l', 'o'); for (let i of arr) ( console.log(i); )
Изход
Здравейте
На for… of
линия прави точно същото като в програмата по-горе.
На for… of
линия поддържа се обадите на next()
метод на итератор. След като достигне done:true
, for… of
цикълът се прекратява.
Потребителски дефиниран итератор
Можете също така да създадете свой собствен итератор и да се обадите next()
за достъп до следващия елемент. Например,
function displayElements(arr) ( // to update the iteration let n = 0; return ( // implementing the next() function next() ( if(n < arr.length) ( return ( value: arr(n++), done: false ) ) return ( value: undefined, done: true ) ) ) ) const arr = ('h', 'e', 'l', 'l', 'o'); const arrIterator = displayElements(arr); console.log(arrIterator.next()); console.log(arrIterator.next()); console.log(arrIterator.next()); console.log(arrIterator.next()); console.log(arrIterator.next()); console.log(arrIterator.next());
Изход
(стойност: "h", готово: false) (стойност: "e", готово: false) (стойност: "l", готово: false) (стойност: "l", готово: false) (стойност: "o" , done: false) (стойност: undefined, done: true)
В горната програма създадохме собствен итератор. На displayElements()
връща функционални value
и done
имуществото.
- Всеки път, когато
next()
методът бъде извикан, функцията се изпълнява веднъж и показва стойността на масив. - И накрая, когато всички елементи на масив са изчерпани,
done
свойството се задава наtrue
, катоvalue
asundefined
.