Slide 1

Slide 1 text

#devES6 A D D I N G E S 6 T O Y O U R T O O L B O X @ j e f f r e y s t r a u ss

Slide 2

Slide 2 text

“ES6? That's the new JavaScript!

Slide 3

Slide 3 text

“ No!

Slide 4

Slide 4 text

ECMAScript

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

ECMAScript

Slide 8

Slide 8 text

ECMAScript 2015

Slide 9

Slide 9 text

not all-or-nothing experiment es6 is an evolution

Slide 10

Slide 10 text

experiment not all-or-nothing

Slide 11

Slide 11 text

strings

Slide 12

Slide 12 text

template literals

Slide 13

Slide 13 text

var greeting = "Hello, " + user.first + " " + user.last + "!"; var url = "www.mysite.com" + "/foo/" + fooId + "/bar/" + barId; ES5:

Slide 14

Slide 14 text

`backticks`

Slide 15

Slide 15 text

${expression}

Slide 16

Slide 16 text

var greeting = "Hello, " + user.first + " " + user.last + "!"; var url = "www.mysite.com" + "/foo/" + fooId + "/bar/" + barId; ES5: var greeting = `Hello, ${user.first} ${user.last}!`; var url = `www.mysite.com/foo/${fooId}/bar/${barId}`; ES6:

Slide 17

Slide 17 text

multi-line strings

Slide 18

Slide 18 text

var poem = "so much depends\n" + "upon\n\n" + "a red wheel\n" + "barrow\n\n" + "glazed with rain\n" + "water\n\n" + "beside the white\n" + "chickens"; ES5:

Slide 19

Slide 19 text

var poem = `so much depends upon a red wheel barrow glazed with rain water beside the white ES6:

Slide 20

Slide 20 text

default parameters

Slide 21

Slide 21 text

var drawRect = function(width, height, color) { width = width || 1; height = height || 1; color = color || 'orange'; /* draw stuff */ return width * height; }; ES5:

Slide 22

Slide 22 text

var drawRect = function(width, height, color) { width = width || 1; height = height || 1; color = color || 'orange'; /* draw stuff */ return width * height; }; drawRect(); // draws orange; returns 1 ES5:

Slide 23

Slide 23 text

var drawRect = function(width, height, color) { width = width || 1; height = height || 1; color = color || 'orange'; /* draw stuff */ return width * height; }; drawRect(); // draws orange; returns 1 drawRect(0, 4, 'blue'); // draws blue, but returns 4 ES5:

Slide 24

Slide 24 text

var drawRect = function(width=1, height=1, color='orange') { /* draw stuff */ return width * height; }; ES6:

Slide 25

Slide 25 text

var drawRect = function(width=1, height=1, color='orange') { /* draw stuff */ return width * height; }; drawRect(0, 4, 'blue'); // returns 0 ES6:

Slide 26

Slide 26 text

collections

Slide 27

Slide 27 text

arrays

Slide 28

Slide 28 text

var myStringArray = new Array("blue"); // ["blue"] var myBoolArray = new Array(false); // [false] ES5:

Slide 29

Slide 29 text

var myStringArray = new Array("blue"); // ["blue"] var myBoolArray = new Array(false); // [false] var myIntArray = new Array(2); // [undefined x 2] ES5:

Slide 30

Slide 30 text

var myIntArray = new Array(2); // [undefined x 2] ES5: var fixedIntArray = Array.of(2); // [2] ES6:

Slide 31

Slide 31 text

function getArgsArray() { return Array.prototype.slice.apply(arguments); }; getArgsArray('foo', true, 42); // ['foo', true, 42] ES5:

Slide 32

Slide 32 text

function getArgsArray() { return Array.prototype.slice.apply(arguments); }; getArgsArray('foo', true, 42); // ['foo', true, 42] ES5: function getArgsArray() { return Array.from(arguments); }; getArgsArray('foo', true, 42); // ['foo', true, 42] ES6:

Slide 33

Slide 33 text

iterables

Slide 34

Slide 34 text

`for-of` loop

Slide 35

Slide 35 text

var body = ['head', 'shoulders', 'knees', 'toes']; for (var i = 0; i < body.length; i++) { tap(body[i]); } ES5:

Slide 36

Slide 36 text

var body = ['head', 'shoulders', 'knees', 'toes']; for (var i = 0; i < body.length; i++) { tap(body[i]); } ES5: var body = ['head', 'shoulders', 'knees', 'toes']; for (var part of body) { tap(part); } ES6:

Slide 37

Slide 37 text

var alphabet = 'abcdefg'; for (var letter of alphabet) { sing(letter); } ES6: E

Slide 38

Slide 38 text

[Symbol.iterator]

Slide 39

Slide 39 text

var alphabet = 'az'; var iter = alphabet[Symbol.iterator](); iter.next(); // { done: false, value: 'a' } iter.next(); // { done: false, value: 'z' } ES6: E

Slide 40

Slide 40 text

var alphabet = 'az'; var iter = alphabet[Symbol.iterator](); iter.next(); // { done: false, value: 'a' } iter.next(); // { done: false, value: 'z' } iter.next(); // { done: true, value: undefined } ES6: E

Slide 41

Slide 41 text

destructuring

Slide 42

Slide 42 text

[ ] = fooArray;

Slide 43

Slide 43 text

{ } = fooObject;

Slide 44

Slide 44 text

var x, y, z, coords; coords = [29, 22, 37]; x = coords[0]; y = coords[1]; z = coords[2]; ES5:

Slide 45

Slide 45 text

var x, y, z, coords; coords = [29, 22, 37]; x = coords[0]; y = coords[1]; z = coords[2]; ES5: var coords = [29, 22, 37]; var [x, y, z] = coords; ES6:

Slide 46

Slide 46 text

var x, y, z, coords; coords = [29, 22, 37]; x = coords[0]; y = coords[1]; z = coords[2]; ES5: var coords = [29, 22, 37]; var [x, y, z] = coords; var [foo, , bar] = coords; ES6:

Slide 47

Slide 47 text

var user, email, display; user = { name: 'Jeff', email: '[email protected]' }; email = user.email; display = user.name; ES5:

Slide 48

Slide 48 text

var user, email, display; user = { name: 'Jeff', email: '[email protected]' }; email = user.email; display = user.name; ES5: var user = { name: 'Jeff', email: '[email protected]' }; var {email} = user; ES6:

Slide 49

Slide 49 text

var user, email, display; user = { name: 'Jeff', email: '[email protected]' }; email = user.email; display = user.name; ES5: var user = { name: 'Jeff', email: '[email protected]' }; var {email} = user; var {name: display} = user; ES6:

Slide 50

Slide 50 text

var point = [10, 2]; var [x, y, z = 0] = point; console.log(z); // 0, not undefined var user = { name: 'Jeff', email: '[email protected]' }; var {name, phone = '867-5309'} = user; console.log(phone); // '867-5309', not undefined ES6:

Slide 51

Slide 51 text

process return values

Slide 52

Slide 52 text

var drawRect = function(width=1, height=1, color='orange') { /* draw stuff */ return width * height; }; ES6:

Slide 53

Slide 53 text

var drawRect = function(width=1, height=1, color='orange') { /* draw stuff */ return {area: width * height, hex: getHex(color)}; }; ES6:

Slide 54

Slide 54 text

var drawRect = function(width=1, height=1, color='orange') { /* draw stuff */ return {area: width * height, hex: getHex(color)}; }; var {area, hex: rgb} = drawRect(4, 6, 'blue'); console.log(area); // 24 console.log(rgb); // '#0000FF' ES6:

Slide 55

Slide 55 text

named parameters

Slide 56

Slide 56 text

var drawRect = function(width=1, height=1, color='orange') { /* draw stuff */ return {area: width * height, hex: getHex(color)}; }; ES6:

Slide 57

Slide 57 text

var drawRect = function({w=1, h=1, color='orange'} = {}) { /* draw stuff */ return {area: w * h, hex: getHex(color)}; }; ES6:

Slide 58

Slide 58 text

var drawRect = function({w=1, h=1, color='orange'} = {}) { /* draw stuff */ return {area: w * h, hex: getHex(color)}; }; var rect = drawRect({color: 'blue'}) console.log(rect); // {area: 1, hex: '#0000FF'} ES6:

Slide 59

Slide 59 text

{ scope }

Slide 60

Slide 60 text

block-scoped vars

Slide 61

Slide 61 text

block-scoped vars

Slide 62

Slide 62 text

function-scoped

Slide 63

Slide 63 text

var foo = function(bar) { if (bar) { var message = 'Hello!'; // declared here alert(message); } return message; // still in scope here }; ES5:

Slide 64

Slide 64 text

iife IMMEDIATELY INVOKED FUNCTION EXPRESSION

Slide 65

Slide 65 text

var foo = function(bar) { if (bar) { (function() { var message = 'Hello!'; // declared here alert(message); })(); } return message; // ReferenceError: message is not defined }; ES5:

Slide 66

Slide 66 text

closure

Slide 67

Slide 67 text

// assume links has an array of DOM elements for (var i = 0; i < links.length; i++) { links[i].onclick = function() { console.log(i); }; } // whoops! all links log the max index! ES5:

Slide 68

Slide 68 text

// assume links has an array of DOM elements for (var i = 0; i < links.length; i++) { links[i].onclick = (function(x) { return function() { console.log(x); // preserved context }; })(i); } // clicking links gives the correct result ES5:

Slide 69

Slide 69 text

hoisting & globals

Slide 70

Slide 70 text

function foo() { x = 10; y = 20; var x, y; var area = x * y; return area; }; ES5:

Slide 71

Slide 71 text

function foo() { x = 10; y = 20; var x, y; var area; area = x * y; return area; }; ES5:

Slide 72

Slide 72 text

function foo() { var x, y; var area; x = 10; y = 20; area = x * y; return area; }; ES5:

Slide 73

Slide 73 text

function foo() { var x, y; // yikes! area may be in the global scope! x = 10; y = 20; area = x * y; return area; }; ES5:

Slide 74

Slide 74 text

let

Slide 75

Slide 75 text

function(bar) { if (bar) { var message = 'Hello!'; // declared here alert(message); } return message; // still in scope here }; ES5:

Slide 76

Slide 76 text

function(bar) { if (bar) { let message = 'Hello!'; // declared here alert(message); } return message; // ReferenceError: message is not defined }; ES6:

Slide 77

Slide 77 text

// assume links has an array of DOM elements for (var i = 0; i < links.length; i++) { links[i].onclick = function() { console.log(i); }; }; // whoops! all links log the max index! ES5:

Slide 78

Slide 78 text

// assume links has an array of DOM elements for (let i = 0; i < links.length; i++) { links[i].onclick = function() { console.log(i); }; }; // all better, with no IIFE or extra closure! ES6:

Slide 79

Slide 79 text

temporal dead zone

Slide 80

Slide 80 text

function foo() { x = 10; // ReferenceError: x is not defined y = 20; let x, y; let area = x * y; return area; }; ES6:

Slide 81

Slide 81 text

arrow functions

Slide 82

Slide 82 text

syntax

Slide 83

Slide 83 text

(args) => { statements }

Slide 84

Slide 84 text

function logSum(x, y) { var sum = x + y; console.log(sum); } ES5:

Slide 85

Slide 85 text

function logSum(x, y) { var sum = x + y; console.log(sum); } ES5: let logSum = (a, b) => { let sum = a + b; console.log(sum); }; ES6:

Slide 86

Slide 86 text

(args) => expression;

Slide 87

Slide 87 text

function sum(x, y) { return x + y; } ES5:

Slide 88

Slide 88 text

function sum(x, y) { return x + y; } ES5: let sum = (x, y) => x + y; ES6:

Slide 89

Slide 89 text

let speak = () => 'Hello!'; let wrappedMethod = (arg) => innerMethod(arg); let announce = (name) => `Announcing ${name}!`; let getUser = () => ( { id: 42, name: 'Jeff' } ); ES6:

Slide 90

Slide 90 text

let speak = () => 'Hello!'; let wrappedMethod = (arg) => innerMethod(arg); let announce = name => `Announcing ${name}!`; let getUser = () => ( { id: 42, name: 'Jeff' } ); ES6:

Slide 91

Slide 91 text

let speak = () => 'Hello!'; let wrappedMethod = (arg) => innerMethod(arg); let announce = (name) => `Announcing ${name}!`; let getUser = () => ( { id: 42, name: 'Jeff' } ); ES6:

Slide 92

Slide 92 text

lexical `this`

Slide 93

Slide 93 text

var person = { name: 'Jeff', greet: function() { console.log('Now greeting ' + this.name); setTimeout(function() { console.log('Hello, ' + this.name + '!'); }, 3000); } }; ES5:

Slide 94

Slide 94 text

var person = { name: 'Jeff', greet: function() { console.log('Now greeting ' + this.name); setTimeout(function() { console.log('Hello, ' + this.name + '!'); }, 3000); } }; person.greet(); // Now greeting Jeff ES5:

Slide 95

Slide 95 text

var person = { name: 'Jeff', greet: function() { console.log('Now greeting ' + this.name); setTimeout(function() { console.log('Hello, ' + this.name + '!'); }, 3000); } }; person.greet(); // Now greeting Jeff ES5:

Slide 96

Slide 96 text

that | self

Slide 97

Slide 97 text

{ }.bind(this)

Slide 98

Slide 98 text

var person = { name: 'Jeff', greet: function() { console.log('Now greeting ' + this.name); var that = this; setTimeout(function() { console.log('Hello, ' + that.name + '!'); }, 3000); } }; ES5:

Slide 99

Slide 99 text

var person = { name: 'Jeff', greet: function() { console.log('Now greeting ' + this.name); setTimeout(function() { console.log('Hello, ' + this.name + '!'); }.bind(this), 3000); } }; ES5:

Slide 100

Slide 100 text

let person = { name: 'Jeff', greet: function() { console.log(`Greeting ${this.name}`); setTimeout(() => { console.log(`Hello, ${this.name}!`); }, 3000); } }; ES6:

Slide 101

Slide 101 text

putting it to use

Slide 102

Slide 102 text

compatibility

Slide 103

Slide 103 text

No content

Slide 104

Slide 104 text

bit.ly/es6-compat

Slide 105

Slide 105 text

No content

Slide 106

Slide 106 text

$ npm install --save-dev babel-cli $ npm install --save-dev babel-preset-es2015

Slide 107

Slide 107 text

$ npm install --save-dev babel-cli $ npm install --save-dev babel-preset-es2015 $ echo '{ "presets": ["es2015"] }' > .babelrc $ babel mySource.js -o myTranspiled.js

Slide 108

Slide 108 text

// .babelrc { "presets": ["es2015"] }

Slide 109

Slide 109 text

$ npm install --save-dev babel-cli $ npm install --save-dev babel-preset-es2015 $ echo '{ "presets": ["es2015"] }' > .babelrc $ babel mySource.js -o myTranspiled.js

Slide 110

Slide 110 text

flexibility

Slide 111

Slide 111 text

flexibility

Slide 112

Slide 112 text

babeljs.io/repl

Slide 113

Slide 113 text

W H E R E T O G O F R O M H E R E not all-or-nothing

Slide 114

Slide 114 text

evolution

Slide 115

Slide 115 text

evolve

Slide 116

Slide 116 text

#devES6 [email protected] @ j e f f r e y s t r a u ss