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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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.4k
The How and Why of Flexible React Components
jenncreighton
0
200
React 16, the future & you
jenncreighton
0
210
Other Decks in Programming
See All in Programming
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
260
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
200
Vite+ Unified Toolchain for the Web
naokihaba
0
320
Creating Composable Callables in Contemporary C++
rollbear
0
150
JavaDoc 再入門
nagise
1
370
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
120
Claspは野良GASの夢をみるか
takter00
0
200
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
590
Webフレームワークの ベンチマークについて
yusukebe
0
170
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
140
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
370
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.3k
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.9k
Test your architecture with Archunit
thirion
1
2.3k
How to make the Groovebox
asonas
2
2.2k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
360
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
420
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
300
Music & Morning Musume
bryan
47
7.2k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
160
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