ECMA-262 - the standard
TC39 - the committee
JavaScript - embedded in history
EcmaScript releases
Arrows Functions
function() {
var self = this;
$xhr = $.ajax({ ... })
$xhr.then(function(){
self.otherFunc();
});
}
Old and busted
function() {
var $xhr = $.ajax({ ... })
$xhr.then((response) => {
this.otherFunc(response);
});
}
New hotness
[1,2,3].reduce((x, y) => x + y, 0); // 6
Simple reduce
String methods
String.prototype.startsWith
String.prototype.startsWith = function(s) {
return this.indexOf(s) === 0;
};
String.prototype.endsWith
String.prototype.endsWith = function(s) {
var t = String(s);
var index = this.lastIndexOf(t);
return index >= 0 && index === this.length - t.length;
};
String.prototype.contains
String.prototype.contains = function(s) {
return this.indexOf(s) !== -1;
};
String.prototype.toArray
String.prototype.toArray = function() {
return this.split('');
};
String.prototype.repeat
String.prototype.repeat = function(n) {
var n = n || 1;
return Array(n + 1).join(this);
}
String.fromCodePoint
String.fromCodePoint(0x41); // -> 'A'
polyfill hereString.prototype.codePointAt
Returns the code point for a given index of a string
polyfill hereArray methods
Array.from
Array.from = function(arrayLike) {
return Array.prototype.slice.call(arrayLike);
}
Array.of
Array.of = function() {
return Array.prototype.slice.call(arguments);
};
Array.prototype.find
Returns the first element that matches a predicate
Analogous to _.find
Array.prototype.findIndex
Returns the first index that matches a predicate or -1
Array.prototype.fill
Fill an array with a value based on a starting and ending index
Number additions
Math additions
Constants existed in C since 1972.
Finally making it to JS, 20 years after inception.
Static assignment, throws on an attempt to reassign.
Default Parameters
Rest Parameters
function() { var args = Array.prototype.slice.call(arguments); }Old and busted
New hotness
args is a real JS Array and not an Array-like object
arguments object is not available along side rest parameters
Spread Operator
Used to spread an array into positional arguments
function f(x, y, z) {
return x + y + z;
}
// Pass each elem of array as argument
f(...[1,2,3]) == 6
Class syntax
class Chicken {
constructor() {
this.wings = 2;
}
hasBones() {
return true;
}
}
extends syntax
Allows extension of native built-ins
class MyArray extends Array {
constructor() { constructor(...args) { super(...args); } }
}
Acts as a real Array with its length property updated accordingly when elements are added or removed
Object literal enhancements
var handler = function(){}
var obj = {
// Shorthand for ‘handler: handler’
handler,
// no longer requires key or function key word
// super calls
toString() {
return 'obj' + super.toString();
}
}
Computer Property Names in Object literals
var x = 'z';
var foo = { [x]: 1 };
console.log(foo['z']); // 1
Destructuring
{ a, b } = { a: 'a', b: 'b', c: 'c', d: 'd'}
Can be deeply nested
Defines variables in current scope
Doesn't throw, can return undefined
[a] = []; // a == undefined
var a = 1; var b = 3; [a, b] = [b, a];
Simple swap operation with no temp variables
Map and Sets
Map
var m = new Map();
m.set('hello', 42);
m.get('hello'); // 42
Allows any type of object as a key
Set
var s = new Set();
s.add('hello').add('world');
s.has('hello') == true; // true
s.size == 2; // true
s.delete('world');
s.size == 1; // true
s.clear;
Sets have unique elements
WeakMap
var s = { foo: 'bar' }
var wm = new WeakMap();
wm.set(s, { extra: 42 });
wm.get(s); // { extra: 42 }
Object-only keyed maps with weakly held references
If the external references fall out of scope, they fall out of the map
WeakSet
var ws = new WeakSet();
ws.add({ hello: 42 });
ws.size == undefined; // true
No external references mean it cannot be held in the set
Template strings
let x = 'multi-line';
`a real
${x} JS
string`
Multiline strings using `backticks`
Interpolation using ${variable} syntax
Sugar for string construction
Analogous to _.extend or $.extend
No recursive option :(
Essentially triple equals with special handling for NaN and +0/-0
Object.is(NaN, NaN); // trueNaN === NaN // falseSmaller library dependencies
Libraries will still be used for sugar
let p = new Promise();
p.then((value) => {
console.log(value);
}, (err) => {
console.log(err);
})
p.fulfill('hello'); // hello
DOM promises are coming separately from ES6
ES6 Promises are a superset of DOM promises
Modules
// lib/math.js
export function sum(x, y) {
return x + y;
}
export var pi = 3.141593;
A simple module that exports a function and a variable
export default
Sets the default import value
// hello.js
export default function() { console.log('hello') }
import hello from 'hello.js' hello() // hello
export * from 'math';
Used to easily export everything from another library and provide extensions or overrides
Module loaders
System.import('lib/math').then(function(m) {
alert("2π = " + m.sum(m.pi, m.pi));
});
Built-in async module loader, with promises
Proxies
Traps and runtime Meta-operations on objects
var target = {};
var handler = {
get: function (receiver, name) {
return `Hello, ${name}!`;
}
};
var p = new Proxy(target, handler);
p.world === 'Hello, world!';
What I didn't cover
Using parts of ES6 right now