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
ES6: the future is now
Search
JSIST
September 28, 2014
Programming
0
710
ES6: the future is now
JSIST 2014
By : Sebastiano Armeli
http://jsist.org
JSIST
September 28, 2014
Tweet
Share
More Decks by JSIST
See All by JSIST
It's never too late to fight your legacy!
jsist
1
120
Componentize all the things!
jsist
1
190
From Website to Webapp: Introducing SAFE
jsist
0
95
Hardware Development for JavaScript Developers
jsist
0
70
This is bigger than us: Building a future for Open Source
jsist
0
72
Getting Started with ClojureScript
jsist
0
92
Ember.js Framework
jsist
2
110
Realtime MVC with Sails.js
jsist
0
140
AngularJS Directives for D3JS: Enhancing the dynamic behavior of data visualization
jsist
0
150
Other Decks in Programming
See All in Programming
JSONataを使ってみよう Step Functionsが楽しくなる実践テクニック #devio2025
dafujii
1
630
基礎から学ぶ大画面対応(Learning Large-Screen Support from the Ground Up)
tomoya0x00
0
3.3k
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
190
今だからこそ入門する Server-Sent Events (SSE)
nearme_tech
PRO
3
250
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
1
450
MCPとデザインシステムに立脚したデザインと実装の融合
yukukotani
4
1.5k
はじめてのMaterial3 Expressive
ym223
2
890
Deep Dive into Kotlin Flow
jmatsu
1
360
Design Foundational Data Engineering Observability
sucitw
3
200
概念モデル→論理モデルで気をつけていること
sunnyone
3
300
奥深くて厄介な「改行」と仲良くなる20分
oguemon
1
560
アプリの "かわいい" を支えるアニメーションツールRiveについて
uetyo
0
280
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
The Pragmatic Product Professional
lauravandoore
36
6.9k
Practical Orchestrator
shlominoach
190
11k
Balancing Empowerment & Direction
lara
3
620
Unsuck your backbone
ammeep
671
58k
GitHub's CSS Performance
jonrohan
1032
460k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
How to train your dragon (web standard)
notwaldorf
96
6.2k
Large-scale JavaScript Application Architecture
addyosmani
513
110k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
A better future with KSS
kneath
239
17k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Transcript
Sebastiano Armeli @sebarmeli http://html5hub.com/wp-content/uploads/2013/11/es6-hiway-sign.png
@sebarmeli Sebastiano Armeli
ES6
History 1995 1996 1997 1998 1999 2000 2003 (May) B.
Eich invented Mocha (Dec) LiveScript renamed to JavaScript JSScript (June) ECMA-262 Ed.1! ! by TC39 committee ECMA-262 Ed.2 ECMA-262 Ed.3 ECMA-262 Ed.4 started ECMA-262 Ed.4 abandoned (Sep) Mocha renamed to LiveScript
History 2005 2007 2008 2009 2011 2014 2015 ES 4
again! (Adobe, Mozilla,! Google)! ES 3.1 ! (Microsoft, Yahoo)! beginning ES 5 spec finalized (June) ECMA-262 Ed.5 (Dec) ES 6 spec completion (Mar) Start publication! (Jun) ECMA-262 Ed.6 ! target release (July) Agreement:! ES3.1 & ES-Harmony! ! ES3.1 becomes ES5
ECMA-262 TC39 ES 4 ES-Harmony ES.Next ES 6 ECMA ES
7 es-discuss
Iteration & Generators Summary Arrow Functions Collections Modularity / Classes
/ Templates Scoping / Destructing / Parameters API improvements Proxies
Iteration & Generators Summary Collections Modularity / Classes / Templates
Scoping / Destructing / Parameters API improvements Proxies Arrow Functions
(Fat) arrow function var y = (x) => x +
1 var y = function(x) { return x + 1; } ES6 ES5
(Fat) arrow function var y = function(x) { return x
+ 1; } ES6 ES5 Syntax sugar var y = (x) => x + 1
(Fat) arrow function var y = function(x) { return x
+ 1; } ES6 ES5 Syntax sugar Lexical `this` binding var y = (x) => x + 1
(Fat) arrow function var y = function(x) { return x
+ 1; } ES6 ES5 No constructor Syntax sugar Lexical `this` binding var y = (x) => x + 1
var y = (x) => {return x + 1} var
y = function(x) { return x + 1; } ES6 ES5
var y = (x) => {return x + 1} var
y = function(x) { return x + 1; } var z = (x, y) => ({ x: x, y: y }) var z = function(x, y) { return { x: x, y: y }; } ES6 ES5
var mapFn = words => words.map((w) => w.length); var mapFn
= function(words) { return words.map(function(w) { return w.length; } } ES6 ES5 mapFn([‘sea’, ‘beach’, ‘do’]); // [3,5,2]
var obj = { doIt: function(){}, handle: function(){ var that
= this; document.addEventListener(‘click’, function(e) { that.doIt(); }); } } ES3
var obj = { doIt: function(){}, handle: function(){ document.addEventListener(‘click’, function(e)
{ this.doIt(); }.bind(this)); } } ES5 var obj = { doIt: function(){}, handle: function(){ var that = this; document.addEventListener(‘click’, function(e) { that.doIt(); }); } } ES3
var obj = { doIt: function(){}, handle: function(){ document.addEventListener(‘click’, (e)
=> this.doIt()); } } ES6
Object.getPrototypeOf(() => {})
Object.getPrototypeOf(() => {}) Function.prototype
When to use ‘function’ ?
Constructors Generators (Methods in object literals)
Summary Arrow Functions Collections API improvements Proxies Scoping / Destructing
/ Parameters Iteration & Generators Modularity / Classes / Templates
Block Scoping Each BLOCK has got its lexical environment let/const
bind variables to the lexical environment Variables declared with let/const are NOT hoisted
var vs let (function() { console.log(y) // “undefined” if (true)
{ var y = “value”; } console.log(y) // “value” }());
var vs let (function() { if (true) { let y
= “value”; } console.log(y) // ERROR!! }()); (function() { console.log(y) // “undefined” if (true) { var y = “value”; } console.log(y) // “value” }());
const (function() { const X; X = “foo”; // ERROR:
x unitialized }()); (function() { const X = “foo”; X = “foo2”; // ERROR: x is read-only }());
Block functions if (true) { function fn () {} }
! fn(); // ERROR!
Destructing array var [x,y] = [‘a’, ‘b’]; ! console.log(x); //
‘a’ ! console.log(y); // ‘b’ ! ! var [x,y] = [y, x]; ! console.log(x); // ‘b’
Destructing object var obj = {width: 50, height: 100}; !
! var {width: w, height: h} = obj; var {width, height} = obj; ! ! console.log(width); // 50 console.log(w); // 50 console.log(height); // 100 console.log(h); // 100
Multiple return value var fn = function(){ return [“50”, “100”];
} ! var [width, height] = fn(); ! console.log(width); //50 console.log(height); //100
var fn = function(){ return { foo: “bar”, fizz: “buzz”
} } ! var {foo, fizz} = fn(); ! console.log(foo); //“bar” console.log(fizz); //“buzz”
Parameter default values function(foo) { foo = foo || “a”;
}
function(foo) { foo = foo || “a”; } function(foo =
“a”) {} Parameter default values
function fn(…args) { console.log(args); //[“a”, “b”, “c”] args.forEach(function(arg) { console.log(arg);
}); } ! fn(“a”, “b”, “c”); ! // a // b // c Rest parameters
Rest parameters function fn(a, …args) { console.log(args); //[“b”, “c”] args.forEach(function(arg)
{ console.log(arg); }); } ! fn(“a”, “b”, “c”); ! // b // c
Spread operator function fn(a, b, c) {} ! var array
= [“A”, “B”, “C”]; fn.apply(null, array);
function fn(a, b, c) {} ! var array = [“A”,
“B”, “C”]; fn.apply(null, array); fn(…array); Spread operator
function fn({id, name}) { console.log(name); } ! fn({name: “Seb”}); //
“Seb Named parameters
Iteration & Generators Summary Collections API improvements Proxies Arrow Functions
Scoping / Destructing / Parameters Modularity / Classes / Templates
for-of for-of loop on ‘iterables’ and iterators Arrays/Sets/Maps are ’iterables’
for-in limitations
for-of var array = [“a”, “b”, “c”]; ! for (let
el of array) { console.log(el); } ! // “a” // “b” // “c”
Iterable { @@iterator: function() -> iterator } { next: function()
-> any } Iterators
Iterator var array = [“a”, “b”, “c”]; ! array.entries() //
Array Iterator array.keys() // Array Iterator Iterator from Array, Map, Set
function* g() { yield “a”; yield “b”; } Generator var
generator = g(); generator ‘constructor’ generator.next(); //{ value: “a”, done: false} generator.next(); //{ value: “b”, done: false} generator.next(); //{ value: undefined, done: true}
! function* g() { yield “a”; var retVal = yield
“b”; return retVal; } var generator = g(); generator.next().value; //“a” generator.next().value; //“b” generator.next(“c”).value; //“c”
! function* asyncFn() { var data = yield getUser(); doSomethingElse(data);
} function run(genFunction) { var generator = genFunction(); generator.next().value.then(function(val){ generator.next(val); }, function(err) { generator.throw(err); }); } run(asyncFn); Promise
for (let el of generator) { console.log(el); } Generators are
iterables
Iteration & Generators Summary Collections API improvements Proxies Arrow Functions
Scoping / Destructing / Parameters Modularity / Classes / Templates
Set NO duplicates values
Set NO duplicates values Different types in a set
Set NO duplicates values Different types in a set add(key)/
has(key) / delete(key)
Set NO duplicates values Different types in a set add(key)/
has(key) / delete(key) values() -> Iterator
let countries = new Set(); countries.add(“US”); countries.add(“Italy”); countries.add(“US”); ! countries
// Set [“US”, “Italy”]
let countries = new Set([“US”, “Italy”]); countries // Set [“US”,
“Italy”] ! ! ! countries.delete(“Italy”); countries // Set [“US”]
! for(let country of countries.values()) { console.log(country); // “US” }
! for(let country of countries) { console.log(country); // “US” }
Map {“foo” : “bar” }
Map {“foo” : “bar” } Keys can be objects
Map {“foo” : “bar” } Keys can be objects get(key);
has(key); set(key,val)
Map {“foo” : “bar” } get(key); has(key); set(key,val) delete(key); clear();
forEach(); Keys can be objects
let dict = new Map(); dict.set(“A”, 1); dict.set(“B”, 2); !
dict // Map {“A”: 1, “B”: 2}
let dict = new Map(); dict.set(“A”, 1); dict.set(“B”, 2); !
dict // Map {“A”: 1, “B”: 2} ! dict.get(“A”); // “1” dict.delete(“B”);
for(let w of dict.keys()) { // Map Iterator console.log(w); //
“A” } ! for(let w of dict.values()) { // Map Iterator console.log(w); // 1 } ! dict.clear(); dict.size; // 0
let dict = new Map([[“x”, 1], [“y”, 2]]); ! !
dict; // Map {x: 1, y: 2} ! ! ! for(let w of dict) { ! console.log(w); // [“x”, 1] // [“y”, 2] ! });
dict.forEach(function(val, key, map) { ! console.log(val); // x // y
! console.log(key); // 1 // 2 ! console.log(map); // Map { x: 1, y: 2} ! });
WeakMap Avoid memory leaks
WeakMap Avoid memory leaks Reference to the key obj held
weakly
WeakMap Avoid memory leaks Reference to the key obj held
weakly Keys must be an objects
WeakMap Avoid memory leaks Reference to the key obj held
weakly Keys must be an objects No iterators methods
Object properties ! with ! Map / WeakMap
Summary Collections API improvements Proxies Arrow Functions Scoping / Destructing
/ Parameters Iteration & Generators Modularity / Classes / Templates
Object Literal ! let obj = { ! __proto__: parentObj,
meth1(a,b) { ! } ! };
Module ! export function register(ad) { return ad; } !
import {register} from “ads”; var app = { doIt: function() { register({}); } } export app; app.js lib/ads.js
export default class {}; // Ad.js import Ad from ‘ad';
// app.'s ! ! import { meth as method } from ‘a’;
Class ! class Animal { constructor(name) { this.name = name;
} toString() { return “This is: ” + this.name; } }
Subclass - super ! class Cat extends Animal { constructor(name,
ownerName) { super(name); this.ownerName = ownerName; } ! toString() { return super() + “ owned by ” + this.ownerName; } }
! class Animal { constructor(name) { this.name = name; }
toString() { return “This is: ” + this.name; } } class Cat extends Animal { constructor(name, ownerName) { super.constructor(name); this.ownerName = ownerName; } ! toString() { return super.toString() + “ owned by ” + this.ownerName; } }
! function Animal(name) { this.name = name; } ! Animal.prototype.toString
= function() { return “This is: ” + this.name; }; ! function Cat(name, ownerName) { Animal.call(this, name); this.ownerName = ownerName; } ! Cat.prototype = Object.create(Animal.prototype); Cat.prototype.constructor = Cat; Cat.prototype.parent = Animal; ! Cat.prototype.toString = function() { var super = Animal.prototype.toString.call(this); return super + “ owned by ” + this.ownerName; };
Template strings var a = “hello”; var b = “world”;
! `${a} ${b}!`
Template strings var a = “hello”; var b = “world”;
! `${a} ${b}!` var multiline = `Hello world !!!`;
Summary Collections API improvements Proxies Arrow Functions Scoping / Destructing
/ Parameters Iteration & Generators Modularity / Classes / Templates
String methods String.prototype.startsWith(str) => boolean String.prototype.endsWith(str) => boolean String.prototype.contains(str) =>
boolean String.prototype.repeat(num) => string
Number methods Number.isInteger(num) => boolean Number.isNaN(num) => boolean Number.isFinite(num) =>
boolean …
Array methods Array.from(obj) => Array Array.prototype.entries => Iterator Array.of(…args) =>
Array Array.prototype.keys => Iterator Array.prototype.values => Iterator
var divs = document.querySelectorAll("div"); ! Array.from(divs); ! // [<div></div>, </div></div>]
! Array.of(10, 11); ! // [10, 11] !
var array = [“a”, “b”, “c”]; ! for (let [index,
el] of array.entries()) { console.log(index, el); // 0 “a” // 1 “b” // 2 “c” } ! for (let index of array.keys()) { console.log(index); } ! for (let el of array.values()) { console.log(el); } !
Object methods Object.setPrototypeOf(obj, proto) Object.assign(obj, mixin) Object.is(value1, value2)
Math methods Math.log2(num) => num Math.log10(num) => num Math.sinh(num) =>
num Math.cosh(num) => num …
Summary Collections API improvements Proxies Arrow Functions Scoping / Destructing
/ Parameters Iteration & Generators Modularity / Classes / Templates
Proxies Proxy(targetObject, interceptors) ! Different use cases (logging, mocking) Meta-programming
var obj = {num: 1}; ! obj = new Proxy(obj,
{ set: function (target, property, value) { target[property] = value + 1; } }); ! obj.num = 2 // [[Set]] console.log(obj.num); // 3 Proxies
function createDefensiveObject(target) { return new Proxy(target, { get: function(target, property)
{ if (property in target) { return target[property]; } else { throw new ReferenceError(); } } }); } ! var obj = createDefensiveObject({name: “Seb”}); console.log(obj.lastname); //ReferenceError http://www.nczonline.net/blog/2014/04/22/creating-defensive-objects-with-es6-proxies/ Proxies
Iteration & Generators Recap Arrow Functions Collections Scoping / Destructing
/ Parameters API improvements Proxies Modularity / Classes / Templates
Promises Symbols Better Unicode support Optimized tail calls Other Features..
ES6 today Traceur compiler (Google) es6-transpiler es6-module-transpiler (Square) es6-shim defs.js
http://wiki.ecmascript.org https://people.mozilla.org/~jorendorff/es6-draft.html http://kangax.github.io/compat-table/es6/ http://esdiscuss.org/ @sebarmeli Sebastiano Armeli