Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Understanding Iterators & Iterables in JavaScript
Search
Jenn Creighton
May 17, 2019
Programming
150
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Understanding Iterators & Iterables in JavaScript
Jenn Creighton
May 17, 2019
More Decks by Jenn Creighton
See All by Jenn Creighton
Everything I Know About React I Learned From Twitter
jenncreighton
0
1.1k
React 16, the future & you (December 4, 2018)
jenncreighton
1
190
The how and why of flexible React components
jenncreighton
7
4.5k
The How and Why of Flexible React Components
jenncreighton
0
200
React 16, the future & you
jenncreighton
0
220
Other Decks in Programming
See All in Programming
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
110
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
720
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
240
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
150
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
450
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
290
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
140
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3.5k
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.3k
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
600
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
140
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
210
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
460
Code Review Best Practice
trishagee
74
20k
Become a Pro
speakerdeck
PRO
31
6.2k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
290
We Are The Robots
honzajavorek
0
290
The World Runs on Bad Software
bkeepers
PRO
72
12k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
440
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Designing for Performance
lara
611
70k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
Transcript
Understanding Iterators & Iterables in JavaScript
Hi! I’m Jenn! Senior Frontend Engineer @gurlcode @ Rent the
Runway
! @gurlcode
... Spread Operator @gurlcode
[ ] @gurlcode
[ 1, 2, 3 ] @gurlcode
...[ 1, 2, 3 ] @gurlcode
...[ 1, 2, 3 ] // 1, 2, 3 @gurlcode
..."abc" // "a", "b", "c" @gurlcode
function* generator( ) { yield 1; yield 2; yield 3;
} …generator( ) // 1, 2, 3 @gurlcode
@gurlcode
Generators 101 @gurlcode
function* count() { yield 1; yield; yield 3; } @gurlcode
function* count() { yield 1; yield; yield 3; } var
generator = count(); Generator {}; @gurlcode
function* count() { yield 1; yield; yield 3; } var
generator = count(); generator.next(); { value: 1, done: false } Generator {};
function* count() { yield 1; yield; yield 3; } var
generator = count(); generator.next(); generator.next(); generator.next(); generator.next(); { value: 1, done: false } { value: undefined, done: false } { value: 3, done: false } { value: undefined, done: true } Generator {}; @gurlcode
function* count() { yield 1; yield; yield 3; } var
generator = count(); generator.next(); generator.next(); generator.next(); generator.next(); { value: 1, done: false } { value: undefined, done: false } { value: 3, done: false } { value: undefined, done: true } Generator {}; @gurlcode
function* count() { yield 1; yield; yield 3; } var
generator = count(); generator.next(); generator.next(); generator.next(); generator.next(); { value: 1, done: false } { value: undefined, done: false } { value: 3, done: false } { value: undefined, done: true } Generator {}; @gurlcode
function* add() { const num = yield; yield 2 +
num; yield 4 + num; } var generator = add(); generator.next(); generator.next(2); generator.next(); generator.next(); { value: undefined, done: false } { value: 4, done: false } { value: 6, done: false } { value: undefined, done: true } Generator {}; @gurlcode
function* add() { const num = yield; yield 2 +
num; yield 4 + num; } var generator = add(); generator.next(); generator.next(2); generator.next(); generator.next(); { value: undefined, done: false } { value: 4, done: false } { value: 6, done: false } { value: undefined, done: true } Generator {}; @gurlcode
function* add() { const num = yield; yield 2 +
num; yield 4 + num; } var generator = add(); generator.next(); generator.next(2); generator.next(); generator.next(); { value: undefined, done: false } { value: 4, done: false } { value: 6, done: false } { value: undefined, done: true } Generator {}; @gurlcode
function* add() { const num = yield; yield 2 +
num; yield 4 + num; } var generator = add(); generator.next(); generator.next(2); generator.next(); generator.next(); { value: undefined, done: false } { value: 4, done: false } { value: 6, done: false } { value: undefined, done: true } Generator {}; @gurlcode
yield* @gurlcode
function* outer() { yield 1; yield* inner(); yield 2; }
function* inner() { yield “a”; yield “b”; } var generator = outer(); Generator {}; @gurlcode
function* outer() { yield 1; yield* inner(); yield 2; }
function* inner() { yield “a”; yield “b”; } var generator = outer(); Generator {}; @gurlcode
function* outer() { yield 1; yield* inner(); yield 2; }
function* inner() { yield “a”; yield “b”; } var generator = outer(); Generator {}; @gurlcode
function* outer() { yield 1; yield* inner(); yield 2; }
function* inner() { yield “a”; yield “b”; } var generator = outer(); Generator {}; @gurlcode
function* outer() { yield 1; yield* inner(); yield 2; }
function* inner() { yield “a”; yield “b”; } generator.next(); generator.next(); generator.next(); generator.next(); generator.next(); { value: 1, done: false } { value: “a”, done: false } { value: “b”, done: false } { value: 2, done: false } { value: undefined, done: true }
function* outer() { yield 1; yield* inner(); yield 2; }
function* inner() { yield “a”; yield “b”; } generator.next(); generator.next(); generator.next(); generator.next(); generator.next(); { value: 1, done: false } { value: “a”, done: false } { value: “b”, done: false } { value: 2, done: false } { value: undefined, done: true }
function* outer() { yield 1; yield* inner(); yield 2; }
function* inner() { yield “a”; yield “b”; } generator.next(); generator.next(); generator.next(); generator.next(); generator.next(); { value: 1, done: false } { value: “a”, done: false } { value: “b”, done: false } { value: 2, done: false } { value: undefined, done: true }
function* outer() { yield 1; yield* inner(); yield 2; }
function* inner() { yield “a”; yield “b”; } generator.next(); generator.next(); generator.next(); generator.next(); generator.next(); { value: 1, done: false } { value: “a”, done: false } { value: “b”, done: false } { value: 2, done: false } { value: undefined, done: true }
function* generator( ) { yield 1; yield 2; yield 3;
} ...generator() // 1, 2, 3 @gurlcode
Arrays Strings Maps Sets Generators @gurlcode
Iterable a data structure that provides an interface for iteration
@gurlcode
Iterable Protocol
Symbol.iterator @gurlcode
Symbol( "key" ) @gurlcode
Array.prototype[ Symbol.iterator ] @gurlcode
String.prototype[ Symbol.iterator ] @gurlcode
function* generator( ) { } generator[ Symbol.iterator ] @gurlcode
Iterator any object which implements the Iterator protocol @gurlcode
Iterator Protocol @gurlcode
function fakeIterator( ) { return { next: function( ) {
} }; } @gurlcode
function fakeIterator( ) { return { next: function( ) {
// return object // with a value // & a done key } }; } @gurlcode
const iterator = fakeIterator( ); const { value, done }
= iterator.next( ); @gurlcode
const iterator = fakeIterator( ); const { value, done }
= iterator.next( ); @gurlcode
Let’s create our own! @gurlcode
None
Async Iterator @gurlcode
Symbol.asyncIterator @gurlcode
... Spread Operator @gurlcode
{ } @gurlcode
...{ } @gurlcode
Thank you! @gurlcode