! @nzgb " @bevacqua
ponyfoo.com
Computed Property Name
function prop (key, value) {
var result = {}
result[key] = value
return result
}
Slide 10
Slide 10 text
! @nzgb " @bevacqua
ponyfoo.com
function prop (key, value) {
var result = {
[key]: value
}
return result
}
Computed Property Name
Slide 11
Slide 11 text
! @nzgb " @bevacqua
ponyfoo.com
function prop (key, value) {
return { [key]: value }
}
Computed Property Name
Slide 12
Slide 12 text
! @nzgb " @bevacqua
ponyfoo.com
Arrow
Functions
Slide 13
Slide 13 text
! @nzgb " @bevacqua
ponyfoo.com
var double = function (value) {
return value * 2
}
Arrow Function
No function keyword
Slide 14
Slide 14 text
! @nzgb " @bevacqua
ponyfoo.com
var double = (value) => {
return value * 2
}
Arrow Function
Fat => arrow instead
Slide 15
Slide 15 text
! @nzgb " @bevacqua
ponyfoo.com
var double = (value) => {
return value * 2
}
Arrow Function
Single parameter?
Implicit (parenthesis)
Slide 16
Slide 16 text
! @nzgb " @bevacqua
ponyfoo.com
var double = value => {
return value * 2
}
Arrow Function
Single expression?
Implicit return, {}
Slide 17
Slide 17 text
! @nzgb " @bevacqua
ponyfoo.com
var double = value => value * 2
Arrow Function
(left, right) => left &&
'left' || right &&
'right' || undefined
But, Avoid complexity!
Slide 18
Slide 18 text
! @nzgb " @bevacqua
ponyfoo.com
[1, 2, 3, 4, 5]
.filter(x => x > 2)
.map(x => x * 2)
.reduce((x, y) => x + y)
// <- 24
Arrow Function
Improved expressiveness
Slide 19
Slide 19 text
! @nzgb " @bevacqua
ponyfoo.com
var timer = {
seconds: 0,
start: function () {
var add = () => this.seconds++
setInterval(add, 1000)
}
}
Arrow Function
Lexical scoping
! @nzgb " @bevacqua
ponyfoo.com
Destructuring
Or the whole parameter list
({a=true, b=1}) => {
console.log(a, b)
}
Slide 49
Slide 49 text
! @nzgb " @bevacqua
ponyfoo.com
Destructuring
Default to an empty object
({a=true, b=1}={}) => {
console.log(a, b)
}
Slide 50
Slide 50 text
! @nzgb " @bevacqua
ponyfoo.com
Rest Parameters
Slide 51
Slide 51 text
! @nzgb " @bevacqua
ponyfoo.com
Rest Parameters
function () {
var list = [].slice.call(arguments)
}
Never again .slice arguments
Slide 52
Slide 52 text
! @nzgb " @bevacqua
ponyfoo.com
Rest Parameters
Use rest … instead
function (…list) {
}
Slide 53
Slide 53 text
! @nzgb " @bevacqua
ponyfoo.com
Rest Parameters
Named parameters and the rest
function () {
var rest = [].slice.call(arguments)
var y = rest.shift()
var x = rest.shift()
}
Slide 54
Slide 54 text
! @nzgb " @bevacqua
ponyfoo.com
Rest Parameters
Effortless using …rest
function (x, y, …rest) {
}
Slide 55
Slide 55 text
! @nzgb " @bevacqua
ponyfoo.com
Rest Parameters
Arrows require parenthesis for rest
var sumAll = (…all) => all
.reduce((x,y) => x+y)
sumAll(1, 1, 2, 3, 5, 8)
// <- 20
! @nzgb " @bevacqua
ponyfoo.com
Spread Operator
new + apply in ES5 is …hard
new (Date.bind.apply(Date, [
null, 2015, 11, 7
]))
Slide 62
Slide 62 text
! @nzgb " @bevacqua
ponyfoo.com
Spread Operator
new + apply in ES6 is …easy
new Date(…[
2015, 11, 7
])
Slide 63
Slide 63 text
! @nzgb " @bevacqua
ponyfoo.com
Spread Operator
Separating array elements is
tedious before ES6
var all = [1, 2, 3, 4]
var first = all[0]
var rest = all.slice(1)
Slide 64
Slide 64 text
! @nzgb " @bevacqua
ponyfoo.com
Spread Operator
Spread while destructuring!
var all = [1, 2, 3, 4]
var [first, …rest] = all
Slide 65
Slide 65 text
! @nzgb " @bevacqua
ponyfoo.com
Spread Operator
Obnoxious casting before ES6
var all = document.querySelectorAll('a')
var links = [].slice.call(all)
Slide 66
Slide 66 text
! @nzgb " @bevacqua
ponyfoo.com
Spread Operator
Iterables are easy to cast
NodeList is iterable by default
var all = document.querySelectorAll('a')
var links = […all]
! @nzgb " @bevacqua
ponyfoo.com
Template Literals
`In ES6, just use
template literals
Multiline supported!`
Multiline support built into template literals
Slide 72
Slide 72 text
! @nzgb " @bevacqua
ponyfoo.com
Tagged Templates
Slide 73
Slide 73 text
! @nzgb " @bevacqua
ponyfoo.com
Template Literals
var tag = (parts, …model) =>
parts.reduce(
(all, part, i) =>
all + model[i-1] + part
)
tag`Hello ${name}!`
Slide 74
Slide 74 text
! @nzgb " @bevacqua
ponyfoo.com
Template Literals
var tag = (parts, …model) =>
parts.reduce(
(all, part, i) =>
all + model[i-1] + part
)
tag`Hello ${name}!`
Slide 75
Slide 75 text
! @nzgb " @bevacqua
ponyfoo.com
Template Literals
var tag = (parts, …model) =>
parts.reduce(
(all, part, i) =>
all + model[i-1] + part
)
tag`Hello ${name}!`
Slide 76
Slide 76 text
! @nzgb " @bevacqua
ponyfoo.com
Template Literals
var tag = (parts, …model) =>
parts.reduce(
(all, part, i) =>
all + model[i-1] + part
)
tag`Hello ${name}!`
Slide 77
Slide 77 text
! @nzgb " @bevacqua
ponyfoo.com
Template Literals
var tag = (parts, …model) =>
parts.reduce(
(all, part, i) =>
all + model[i-1] + part
)
tag`Hello ${name}!`
Strictly better than
'single' or "double"
quoted strings
Slide 78
Slide 78 text
! @nzgb " @bevacqua
ponyfoo.com
Let Variables
Slide 79
Slide 79 text
! @nzgb " @bevacqua
ponyfoo.com
Let, Const, and the “TDZ”
function multiplySmall (input) {
if (input < 10) {
var mult = 2
return mult * input
}
return input
}
var mult is function-scoped
Slide 80
Slide 80 text
! @nzgb " @bevacqua
ponyfoo.com
Let, Const, and the “TDZ”
function multiplySmall (input) {
if (input < 10) {
let mult = 2
return mult * input
}
return input
}
let mult is block-scoped
Slide 81
Slide 81 text
function multiplySmall (input) {
if (input < 10) {
let mult = 2
return mult * input
}
return input
}
let mult is hoisted to top of block
! @nzgb " @bevacqua
ponyfoo.com
Let, Const, and the “TDZ”
Slide 82
Slide 82 text
! @nzgb " @bevacqua
ponyfoo.com
“Temporal Dead” Zone
Slide 83
Slide 83 text
TDZ for amount variable
! @nzgb " @bevacqua
ponyfoo.com
Let, Const, and the “TDZ”
if (true) {
// other
// statements
let amount = 2
}
[ Accessing
amount
within TDZ
throws
Slide 84
Slide 84 text
! @nzgb " @bevacqua
ponyfoo.com
Constants
Slide 85
Slide 85 text
const is like let, except:
items must be initialized
items is read-only
items is not immutable
! @nzgb " @bevacqua
ponyfoo.com
Let, Const, and the “TDZ”
const items = [1,2,3]
items = [5]
items.push(4)