let fibonacci100Iterator = { last: 0, previous : 1, index: 0, next: function(){ let value = this.last + this.previous; this.previous = this.last; this.last = value; return {done: this.index++ > 100, value: value}; } }; while(true){ let {done, value} = fibonacci100Iterator.next(); console.log(value); if(done) break; }
ES6 wprowadza nowy typ danych: Symbol. Od teraz obiekty mogą mieć klucze typu string lub właśnie Symbol. Zadaniem funkcji Symbol() jest wygenerowanie unikalnego identyfikatora tak, by uniknąć kolizji wartości. Obiekt Symbol zawiera kilka predefiniowanych propercji będących symbolami dla różnych konstrukcji ES6. Jedną z nich jest Symbol.iterator.
Obiekty, które pod kluczem Symbol.iterator będą miały zdefiniowaną funkcję zwracającą iterator nazywane będą iterable. Każdy iterable może być odpytywany za pomocą nowej pętli for ..of.
let iterableFib = { [Symbol.iterator] : function(){ return fibonacci100Iterator; } }; for(let val of iterableFib){ console.log(val); }
Kolejną konstrukcją są generatory, czyli funkcje zwracające wiele wartości, jedna po drugiej. Obiekt generatora nie wykonuje się od razu, lecz zwraca obiekt implementujący iterable. Z każdym wywołaniem metody next wykonywana jest ona do napotkania pierwszej instrukcji yield. Wtedy wykonanie zostaje zatrzymane, aż do kolejnego wywołania next.
function* fibonacci_generator() { let last = 0; let previous = 1; let index = 0; while(index++ < 100){ let value = last + previous; previous = last; last = value; yield value; } }
Brak komentarzy:
Prześlij komentarz