ES6 dans ton code
Beaucoup de changements
Réapprendre JavaScript
Sucre syntaxique
Lisibilité, concision et qualité
const fruits = ['orange', 'banana', 'apple'];
// ES5
fruits.forEach(function(fruit, position, fruits) {
console.log('#' + (++position) + '/' + fruits.length + ': ' + fruit);
});
// ES6: Destructuring
fruits.forEach(function(fruit, position, { length }) {
console.log('#' + (++position) + '/' + length + ': ' + fruit);
});
// ES6: Fat arrow
fruits.forEach((fruit, position, { length }) => {
console.log('#' + (++position) + '/' + length + ': ' + fruit);
});
const chars = [{
name: 'comma',
char: ','
}, {
name: 'point',
char: '.'
}];
// ES5
console.log(chars.reduce(function(charMap, char) {
charMap[char.name] = char.char;
return charMap;
}, {}));
// ES6
console.log(chars.reduce((charMap, char) => (
charMap[char.name] = char.char, charMap
), {}));
// ES6 Generators
function* search(char, str, {
caseSensitive = false,
matchAll: all = true
} = {}) {
let index = 0;
while(index < str.length) {
if(
str[index] === char || (
caseSensitive && str[index].toLowerCase() === char.toLowerCase()
)) {
yield index;
}
index++;
};
}
let gen = search('a', 'Azertyazerty', {caseSensitive: true});
for(let index of gen) {
console.log(index);
}
// ES5
parseInt('111110111', 2);
parseInt('767', 8);
// ES6
0b111110111;
0o767;
// ES5
var x = obj.x;
var y = obj.y;
// etc...
// ES6
let [x, y] = [0, 1];
let {x, y} = {x: 0, y: 1};
let [x, y, ...otherDims] = [0, 1, 1, 2];
// ES7
let {x, y, ...otherDims} = {x:0, y: 1, z: 1, t: 2};
RIP var
Mais aussi
- Nouvelles méthodes pour Math, Number, String.
- Template strings (tagged templates!)
- Support d'Unicode (RegExp, String.prototype.codePointAt/String.fromCodepoint)
- etc...
POO
Elle n'a pas dit son dernier mot
'use strict';
const instances = new WeakSet();
export default class Service {
// Allow to access living instances
static getInstances() {
return instances;
}
// Run at service attachment
constructor(name) {
instances.add(this);
this.name = name;
}
}
'use strict';
import Service from '../service';
// A simple log service
export default class extends Service {
constructor(name = 'logger') {
super(name)
}
log(...args) {
let type = args.unshift();
if('function' === this[type]) {
console[type].apply(console, args);
} else {
console.log.apply(console, arguments);
}
}
info() {
console.info.apply(console, arguments);
}
debug() {
console.debug.apply(console, arguments);
}
error() {
console.error.apply(console, arguments);
}
}
Intérêt
- récupérer les développeurs Java
- encapsuler la logique
- structurer la POO en JS
Meta programmation
Proxy
let myArray = ['a', 'b', 'c'];
let proxy = new Proxy(myArray, function() {
let lengthSets = 0;
return {
set: function(target, property, value) {
console.log(`Array length set $(++lengthSets) time(s).`);
target[property] = value;
}
};
}());
proxy.length = 2;
// Array length set 1 time(s).
proxy.length = 1;
// Array length set 2 time(s).
Reflect
let myObj = {
test: 'test'
};
Reflect.deleteProperty(myObj, 'test');
// équivalent de 'delete myObj.test;'
Reflect.set(myObj, 'test', 'test');
// équivalent de 'myObj.test = 'test';
Reflect.construct(Array, args)
// équivalent de
// https://github.com/nfroidure/StreamQueue/blob/1d1399ee9bbd25d3d53d1eca74f40aea124e3d9e/src/index.js#L16-17
// etc..
Symbols
var myUniqueSymbol = Symbol('test');
console.log(myUniqueSymbol.toString() == Symbol('test'));
// false
var obj = {
[myUniqueSymbol]: 'plop'
};
console.log(obj[myUniqueSymbol]);
// plop
console.log(Object.getOwnPropertyKeys(obj));
// []
console.log(Object.getOwnPropertySymbols(obj));
// [Symbol(test)]
var myGlobalSymbol = Symbol.for('test');
console.log(myGlobalSymbol == Symbol.for('test'));
// true
Intérêt
- tests unitaires (stubs, spies ...)
- debugging
- code coveraging
- ajout de features
- tout le reste, sauf développer ?
Ressources
Intronisation
Promise
new Promise(function(resolve, reject) {
var startTime = Date.now();
setTimeout(function() {
resolve(startTime - Date.now());
}, 1000);
}).then(function(result) {
console.log(result);
}, function(err) {
console.error(err);
});
Map / WeakMap
var map = new Map();
map.set('key', 'value');
console.log(map.get('key'));
// value
map.delete('key');
var wMap = new WeakMap();
wMap.set('key', {});
console.log(wMap.get('key'));
// undefined
map.set('key', 'value');
map.set('key2', 'value2');
for(let [key, value] of map) {
console.log('key', key, 'value', value);
}
// key key value value
// key key2 value value2
Set / WeakSet
let set = new Set();
let obj1 = {label: 'object1'};
set.add(obj1);
console.log(set.has(obj1));
// true
set.delete(obj1);
var wSet = new WeakSet();
wSet.add({});
set.add({label: 'object1'});
set.add({label: 'object2'});
for(let obj of set) {
console.log('obj', obj);
}
// obj {label: 'object1'}
// obj {label: 'object2'}
Ressources
Features
Tail calls
function recursive(obj, prop) {
if(!obj[prop]) {
return obj;
}
return recursive(obj[prop], prop);
}
recursive({
child: {
child: {
hey: 'test'
}
}
}, 'child');
// { hey: 'test' }
Modules
// Module 1
export myModule1 = {
myGreatFunction() {
console.log('great');
}
myLolFunction() {
console.log('lol');
}
};
// Module 2
import {
myGreatFunction,
myLolFunction
};
export function greatLol() {
myGreatFunction();
myLolFunction();
};
Module Loader
// Dynamic loading – ‘System’ is default loader
System.import("lib/math").then(function(m) {
alert("2π = " + m.sum(m.pi, m.pi));
});
// Create execution sandboxes – new Loaders
var loader = new Loader({
global: fixup(window) // replace ‘console.log’
});
loader.eval("console.log(\"hello world!\");");
// Directly manipulate module cache
System.get("jquery");
System.set("jquery", Module({$: $})); // WARNING: not yet finalized
ES7
- Decorators
- Comprehension
- Async functions
- etc...