ES6
The Future Is NaN Now
Hi :-)
I'm Jim Cowart.
@ifandelse => (twitter, github, instagram)
<3 I work for LeanKit. <3
Brace Yourselves
ES WAT?
First - Definitions & History
In Case You Didn't Know
-
Why "ES6"? This is short for:
-
"ECMAScript Language Specification, Edition 6"
- "ECMA WAT?!"
ECMAScript is the official name of JavaScript.
You can thank Sun's Java trademark (at the time) for this. -
"TC39" -> ECMA Technical Committee 39.
Responsible for evolving JavaScript.
1995
While Keanu Reeves carried 320GB of data in his brain...
Netscape released LiveScript with Navigator 2
& later re-named it JavaScript.
1996-97
While Jeff Golblum was using a Powerbook to upload a virus to an alien mothership, the ECMAScript 1 (ES1) spec was submitted & then published in 1997
1998
Willis & Affleck were saving the planet from Armageddon while ECMAScript 2 was being published...
1999
JavaScript was busy being improved with ES3 while
Lucas was busy ruining Star Wars with JarJarScript.
Browser War Dark Ages in Full Swing
2002
JSON Released
2006
jQuery Released
2008
Google Chrome Released
Fringe Begins Airing
RIP Netscape Navigator
ES4 Abandoned
2008-2009
TC39 resolves > 1 yr split & moves forward
Eich is Revealed to be Gandalf
ES5 is Released
(But many fail to enjoy all of it thanks to IE6-8)
ES6 Status/Schedule
- Features already appearing in browsers
- Features are 'frozen'
- "Finished" by end of 2014
(other than late-arriving bugs) -
June 2015 - Formal Publication
Don't Worry
ES6 does not "break" older JavaScript.
All JavaScript must be runnable on all runtimes in use.
In other words, ES5 will continue to work.
Hang On a Sec...
"Are you about to tell me about a bunch of cool
language features that I can't use right now?"
Actually, no! You can write in ES6 today using most
major features and transpile to ES5 as a build step
(with source maps!).
With traceur it's as simple as:
traceur --out ./out/transpiled.js --script es6Source.js
(Links to resources included at the end.)
Goals
- Scope & Assignment
- Functions
- String & Object API Additions
- Number API Additions
- Array API Additions
- Loops, Generators, Collections & more
- Promises
- Modules/Classes
- Proxies
- Symbols
Scope & Assignment
Block Scope - Let
Block Scope - Let
Const
Destructuring
Destructuring
Functions
Arrow Functions
⇒
Functions - The ES5 Way
The ES6 Way
The ES5 Way
The ES6 Way
The ES5 Way
The ES6 Way
Default Params
In ES5:
Default Params
ES6:
Spread & Rest
ES5:
Spread & Rest
ES6
Named Parameters
(more destructuring)
Named Parameters
With Defaults Values!
String & Object API Additions
String Templates
Multi-line Strings
String API Sugar
(In other words: "FINALLY!")
Object.is
Object Literal Shorthand
Object Literal Shorthand
Object.assign
Number API Additions
Number.isInteger
Number.isSafeInteger
Number.isNaN
Array API Additions
Array.findIndex()
In ES5
Array.findIndex()
ES6
Array.find()
ES5
Array.find()
ES6
Array.fill()
Array.from()
ES5
Array.from()
ES6
Array.from()
ES6
Loops, Generators
Collections & More
Loops Made Better
ES5
Loops Made Better
ES5
Loops Made Better
ES6
for-of + generators
Generators
- Allow you to "pause & resume" a function
- "Interruptible Computations" – Dave Herman
-
"Shallow Coroutines" – Axel Rauschmayer
- Great for simplifying asynchronous code
Generators - The Basics
Generators - The Basics
What's Really Going On?
- Generators return a generator object
that is an iterator
- An iterator has a `next` method
- Calling next returns an object
- with a `value`
- and a `done` boolean
What's Really Going On?
Generating Awesome
Generating Awesome
"Pausing with yield =>
concurrency minus the callbacks"
– Dave Herman
Map
- Data structure mapping Keys & Values
- Can be iterated over via for-of
- Not Limited to string keys!
Map
Map
WeakMap
- Keys are weakly held* Objects
- Values are anything
- Keys are not enumerable
(because of garbage collection)
WeakMap
Set
A Collection - with *no* duplicates
Set
Going Array-to-Set and Back
WeakSet
- Holds weakly held* Objects only
- Objects will be unique (like Set)
- Not enumerable
WeakSet
Promises
Promises
- Represent the result of an async operation
(then-able)
- Have existed in libs like when.js, Q, RSVP
& jQuery
- Are now native to JavaScript
Promises
Most of us have seen something like:
Promises
Creating a Promise in ES6:
Promises
Promise.all()
Structural / Organizational Features
Modules!
Until Now Our Choices Have been:
-
AMD
-
CommonJS
-
Hand-rolled/Revealing Module/etc
- Scope? Encapsulation? What's that ?
FINALLY -
we have a native way to organize code!
Modules
Exporting:
Modules
Exporting:
Modules
Importing:
Classes
If you <3 building your prototype
chains manually, don't worry.
Classes are syntactical sugar over
prototypes & object instances.
ES5 Parent "Class"
ES5 Child "Class"
ES6 Parent Class
ES6 Child Class
Proxies
- Allows you to define the 'semantics' of an
object in JavaScript (as opposed to C++)
- Gives you hooks to intercept/trap certain
operations
- Use-cases include:
- default values/'method missing'
- validation
- value correction/transformation
- logging, profiling (& other cross-cutting concerns)
- and More!
Proxies
Proxies
Proxies
Symbols
- New kind of primitive
- Each one is unique (name-collision avoidance!)
- Can be used as an identifier for object properties
- Symbol-keyed members:
- Are not visible in for-in iterations
- Are not serialized with JSON.stringify
Enum-like Symbols
Symbols as Identifiers
ES7 Sneak Peak
(ES7 Sneak Peak)
Array Comprehensions
Quickly create a new Array based on an existing one:
(ES7 Sneak Peak)
Array Comprehensions
Using `if`:
(ES7 Sneak Peak)
Hipster Comprehensions
Artisanal Cartesian Products
What if want our hipster names grouped instead?
(ES7
Sneak Peak)
Double Shot Comprehensions
(ES7
Sneak Peak)
Double Shot Comprehensions
Chambray Embroider-able Names
(ES7 Sneak Peak)
Generator Comprehensions
Resources
Other Fantastic Slide Decks
Q & A
ES6 - the Future is Now
By Jim Cowart
ES6 - the Future is Now
A whirlwind tour of many features coming to JavaScript in ES6.
- 6,200