Joan León PRO
Frontend Developer @AdevintaSpain · Perf Reviewer at @PerfReviews_ · Creative Coder at @CodingGirona · @GoogleDevExpert in web technology · ❤️ CSS, Animation & #webperf
Edición | Fecha de publicación | Cambios desde la edición anterior |
---|---|---|
1 | Junio de 1997 | Primera edición |
2 | Junio de 1998 | Cambios editorales para mentener la especificación completa alineada con el estándar internacional ISO/IEC 16262 |
3 | Dicembre de 1999 | Se agregaron expresiones regulares, mejor manejo de strings, nuevo control de declaraciones, manejo de excepciones con try/catch, definición más estricta de errores, formato para la salida numérica y otras mejoras. |
4 | Abandonado | La cuarta edición fue abandonada debido a diferencias políticas respecto a la complejidad del lenguaje. Muchas características propuestas para la cuarta edición fueron completamente abandonadas; algunas fueron propuestas para la edición ECMAScript Harmony. |
5 | Diciembre de 2009 | Agrega el modo estricto ("strict mode"), un subconjunto destinado a proporcionar una mejor comprobación de errores y evitar constructores propensos a errores. Aclara varias ambigüedades de la tercera edición, y afina el comportamiento de las implementaciones del "mundo real" que difieren consistentemente desde esa especificación. Agrega algunas nuevas características, como getters y setters, librería para el soporte de JSON, y una más completa reflexión sobre las propiedades de los objetos. |
Edición | Fecha de publicación | Cambios desde la edición anterior |
---|---|---|
5.1 | Junio de 2011 | Esta edición 5.1 de la ECMAScript Standard está completamente alineada con la tercera edición del estándar internacional ISO/IEC 16262:2011. |
6 | Junio de 2015 | La sexta edición agrega cambios significativos en la sintaxis para escribir aplicaciones complejas, incluyendo clases y módulos, definiéndolos sémanticamente en los mismos términos del modo estricto de la edición ECMAScript 5. Otras nuevas características incluyen iteradores for/of loops, generadores y generador de expresiones estilo Python, funciones de dirección, datos binarios, colecciones (mapas, sets, mapas débiles), y proxies (?metaprogramación para objetos virtuales y wrappers). Al ser la primera especificación “ECMAScript Harmony”, es también conocida como “ES6 Harmony”. |
7 | En progreso | La séptima edición está en una etapa muy temprana de desarrollo, pero está orientada a continuar con la reforma del lenguaje, aislamiento de códigos, control de efectos y librerías/herramientas habilitadas desde ES6. Nuevas características propuestas incluyen promesas/concurrencia, matemáticas y datos numéricos mejorados, guards y trademarks (una alternativa al tipado estático), sobrecarga de operadores, value types (first-class number-like objects), nuevas estructuras de registro (registros, tuples y vectores tipados), pattern matching, y traits. |
(function() {
let x = 'Hola Dani';
if(true) {
let x = 'Hola Joan';
}
console.log(x); // Imprime en consola Hola Dani
})();
(function() {
const HELLO = 'hello world';
HELLO = 'hola mundo';
// Dará ERROR, ya que es de sólo lectura
})();
(function() {
const PI;
PI = 3.15;
// Dará ERROR, ya que ha de asignarse un valor en la declaración
})();
// ES5
var hello = 'Hola Mundo';
// ES6
let hello = `Hola Mundo`;
// ES5
var text = ['En un lugar',
'de la mancha,',
'de cuyo nombre',
'no quiero acordarme'].join('\n');
// ES6
var quijote = `En un lugar
de la mancha,
de cuyo nombre
no quiero acordarme`;
// ES5
var joan = {
name: 'Joan',
age: 41
};
var greet = function(person) {
return 'Hello! My name is ' + person.name +
' and I\'m ' + person.age + ' years old';
};
greet(joan);
// ES6
var greet = function(person) {
return `Hello! My name is ${person.name} and I'm ${person.age} years old`;
};
// ES6
let myAge = `Mi edad es ${person.age + 3} años`;
var numbers = ["1", "2", "3"];
// without destructuring
const one = foo[0];
const two = foo[1];
const three = foo[2];
// with destructuring
var [one, two, three] = foo;
// ES6
var persona = {nombre: 'Joan', apellidos: 'León'};
var {nombre, apellidos} = persona;
console.log(nombre); // Joan
console.log(apellidos); // León
// ES6
var persona = {nombre: 'Joan', apellidos: 'León'};
var {nombre: name, apellidos: surname} = persona;
console.log(name); // Joan
console.log(surname); // León
// ES5
function drawCircle(options) {
options = options || {};
var radius = options.radius || 30;
var coords = options.coords || { x: 0, y: 0 };
console.log(radius, coords);
// finally, draw the circle
}
// ES6
function drawCircle({radius = 30, coords = { x: 0, y: 0}} = {}) {
console.log(radius, coords);
// draw the circle
}
drawCircle();
// radius: 30, coords.x: 0, coords.y: 0 }
drawCircle({radius: 10});
// radius: 10, coords.x: 0, coords.y: 0 }
drawCircle({coords: {y: 10, x: 30}, radius: 10});
// radius: 10, coords.x: 30, coords.y: 10 }
// ES6
const values = [1, 2, 3, 4];
console.log(values); // [1, 2, 3, 4]
console.log(...values); // 1 2 3 4
En la primera impresión por consola, enviamos directamente el array a la función log. En cambio, en la segunda, descomponemos el array en un conjunto de parámetros que se pasan como argumentos a la función log, así que imprime cada valor directamente.
// ES5
var f = function(x, args) {
return x + args.length;
};
var parameters = [ "hello", true ];
console.log(f(3, parameters)); // 5
// ES6
var f = function (x, ...y){
return x + y.length;
};
console.log(f(3, "hello", true)); // 5
// ES5
var echo = function(text) {
return text;
};
// ES6
const echo = text => text;
console.log(echo('Hola Desarrolloweb!')); // Hola Desarrolloweb!
// ES6
const sum = (a, b) => a + b;
console.log(sum(1, 1)); // 2
// ES6
const greet = () => 'ES6 mola!';
console.log( greet() ); // ES6 mola!
// ES6
const expand = (rectangle) => {
rectangle.x += 10;
rectangle.y += 20;
return rectangle;
};
var rectangle = { x: 1, y: 2 };
console.log( expand(rectangle) ); // {x: 11, y: 22}
// ES6
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return `(${this.x}, ${this.y})`;
}
}
var p = new Point(25, 8);
p.toString(); //(25, 8)
//File: lib/curso.js
export function curso(nombre) {
return nombre;
};
// export default function(nombre) {...};
//File: app.js
import { curso } from './curso';
var app = {
hangout: function() {
curso('ES6');
}
}
export app;
// ES5
function msgAfterTimeout (msg, who, timeout, onDone) {
setTimeout(function () {
onDone(msg + " Hello " + who + "!");
}, timeout);
}
msgAfterTimeout("", "Foo", 100, function (msg) {
msgAfterTimeout(msg, "Bar", 200, function (msg) {
console.log("done after 300ms:" + msg);
});
});
// ES6
function msgAfterTimeout (msg, who, timeout) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(`${msg} Hello ${who}!`), timeout)
})
}
msgAfterTimeout("", "Foo", 100).then((msg) =>
msgAfterTimeout(msg, "Bar", 200)
).then((msg) => {
console.log(`done after 300ms:${msg}`)
})
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return `(${this.x}, ${this.y})`;
}
}
var p = new Point(25, 8);
p.toString();
ES6
"use strict";
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Point = (function () {
function Point(x, y) {
_classCallCheck(this, Point);
this.x = x;
this.y = y;
}
_createClass(Point, [{
key: "toString",
value: function toString() {
return "(" + this.x + ", " + this.y + ")";
}
}]);
return Point;
})();
var p = new Point(25, 8);
p.toString();
ES5
By Joan León