Daniel de la Cruz Calvo
Software Engineer and professional mentor for developers.
Érase una vez, la cosa más alucinante que podías poner en una web era algo de este estilo:
alert("Hola! Bienvenido a mi página web!");1994
1996
1997
2000
2005
2009
2015
| Stage | Purpose |
|---|---|
| 0 (Strawman) | Permite incorporar la propuesta a la especificación |
| 1 (Proposal) | Se describe la necesidad de la funcionalidad y se describe la solución, así como futuros cambios |
| 2 (Draft) | Se describe la sintaxis y semática utilizando formal |
| 3 (Candidate) | Se recoge feedback de implementaciones y usuarios |
| 4 (Finished) | Indica que la funcionalidad está lista para entrar en la especificación formal del estándar |
Absolutamente, sí.
myJavascript("foobar");myNewTransformedJavaScript("yay!");Escribes tu JavaScript
Babel lo transforma
npm i --save-dev babel-cli{
"presets": [ "es2015" ],
"plugins": []
}import babel from 'babel-core';
const code = `class Example {}`;
const result = babel.transform(code, { /* options */ });
result.code; // Generated code
result.map; // Sourcemap
result.ast; // AST
Sobreescribe la función require() de Node.JS y realiza las transformaciones de dependencias al vuelo
require("babel-register");
Todos los archivos requeridos por Node.JS a partir de esta línea con extensión .es6, .es, .jsx y .js serán transformados por Babel.
require("babel-polyfill");
// O bien
import 'babel-polyfill';
let holaMundo = `Hola, mundo!`;const lorem = `Lorem ipsum dolor sit amet,
consectetur adipisicing elit,
sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua.`;const COLOR = 'blue';
const CAPTAIN_OBVIOUS = `The heaven is ${COLOR}`;const tag = function(strings, args){
...
};
const NAME = 'Dani';
tag`Hola ${NAME}`;const raw = function(strings, args) {
return strings.raw[0];
}
console.log(raw`Hello!\n`); // Hello!\nconst numbers = ['1', '2', '3'];
const [uno, dos, tres] = numbers;let object = { one: 1, two: 2 };
let {one, two} = object;function sayHello({
name = 'Joan',
surname = 'Leon'
} = {}) {
console.log('Hello', name, surname);
};
sayHello();const values = [1, 2, 3, 4];
console.log(values); // [1, 2, 3, 4]
console.log(...values); // 1 2 3 4const echo = text => text;
console.log(echo('Hello, arrow functions!'));const echo = function(text) {
return text;
};
console.log(echo('Bye, non-arrow functions!'));class Sample {
constructor(value) {
this.value = value;
}
static staticMethod() {
return 'Soy un método estático';
}
prototypeMethod() {
return 'Soy un método de prototipo';
}
}const myES6Object = {
foo(){
// ...
},
bar(x, y){
// ...
}
}const propertyKey = 'foo';
const something = 'ar';
const object = {
[propertyKey]: true,
[`b${something}`]: 123
};const methodKey = 'greeting';
const yetAnotherObject = {
[methodKey]() {
return 'Hello!';
}
};var numbers = [1, 2, 3, 4];
for(const number of numbers){
console.log(number);
}Un objeto será iterable si implementa una propiedad mediante el símbolo:
[Symbol.iterator]let promise = readFile('data.txt');const doPromise = () => {
return new Promise((resolve, reject) => {
// Do something
if(error){
reject(error);
}
// If succeeds
resolve(result);
});
};let promiseResult = doPromise();
promise.then((result) => {
// fullfillment
}).catch((err) => {
// rejection
});Un símbolo es un tipo de datos cuyos valores son únicos e inmutables.
Dichos valores pueden ser utilizados como identificadores de las propiedades de los objetos
let mySymbol = new Symbol('mySymbol');var target = { /* propiedades y métodos */ };
var handler = { /* funciones capturadoras */ };
var proxy = new Proxy(target, handler);La API Proxy define un constructor de proxies al que se le pasa como primer argumento el objeto que se va a capturar (llamado target) y como segundo argumento el handler que realizará la captura. Ejemplo:
const target = {};
const handler = {
get(target, propKey, receiver) {
console.log(`get ${propKey}`);
return 'hello';
}
}
const proxy = new Proxy(target, handler);
console.log(proxy.foo);
// get foo
// helloLos proxies de ES2015 proporcionan una API para capturar o interceptar cualquier operación realizada sobre un objeto y para modificar cómo se comporta ese objeto. Los proxies de JavaScript son útiles para muchas cosas, como por ejemplo:
var validator = {
set: function(obj, prop, value) {
if (prop === 'yearOfBirth') {
if (!Number.isInteger(value)) {
throw new TypeError('yearOfBirth no es un número entero');
}
if (value > 3000) {
throw new RangeError('yearOfBirth no parece válido');
}
}
// operación original para guardar el valor en la propiedad
obj[prop] = value;
}
};
var person = new Proxy({}, validator);
person.yearOfBirth = 1986;
console.log(person.yearOfBirth); // 1986
person.yearOfBirth = 'eighties'; // lanza una excepción
person.yearOfBirth = 3030; // lanza una excepciónObjeto global que proporciona funciones estáticas capaces de intereceptar operaciones de JavaScript
La mayoría de sus métodos estáticos tienen una equivalencia en el objeto Object o Function
Las ventajas que ofrece el uso de Reflect son:
Reflect.apply(target, thisArgument, argumentsList)
// ES5
Function.prototype.apply.call(Math.floor, undefined, [1.75]);
// ES2015
Reflect.apply(Math.floor, undefined, [1.75]); // 1;Reflect.defineProperty(target, propertyKey, attributes)
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}Reflect.deleteProperty(target, propertyKey)
var obj = { x: 1, y: 2 };
Reflect.deleteProperty(obj, "x"); // true
obj; // { y: 2 }class Person {
@readonly
name() { return `${this.first} ${this.last}` }
}const readonly = (target, name, descriptor) => {
// ...
}
const readonly = (target, name, descriptor) => {
descriptor.writable = false;
return descriptor;
}By Daniel de la Cruz Calvo
Aprende ECMAScript 2015 (ES6), el último estándar del lenguaje JavaScript
Software Engineer and professional mentor for developers.