Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ECMAScript
1. Qué es
2. Babel
3. Variables de bloque y constantes
4. Nivel de Bloques
5. Plantillas de cadenas de texto
6. Funciones flecha
7. Objetos literales
8. Destructuración
9. Parámetros por defecto
10. Parámetros Rest
11. Operador de propagación
12. Clases
13. Módulos
14. Promesas
15. Iteradores
16. Símbolos
17. Generadores
18. Proxies
19. Reflexión
20. Decoradores
21. Funciones Asíncronas
22. Métodos clase String
23. Números octales y binarios
24. Métodos clase Math
25. Métodos clase Array
26. Métodos clase Object
27. Maps Sets y Weaks
Qué es
ECMAScript es el nombre del estándar internacional que define JavaScript.
Definido por un comité técnico (TC-39 ) de ecma international.
Identificado como Ecma-262 y ISO/IEC 16262.
No es parte de la W3C.
https://jonmircha.com/ecmascript 1/22
19/5/22, 16:03 ECMAScript | jonmircha
🔙 Regresar
Babel
Es un compilador de JavaScript, te permite usar el JavaScript del futuro, HOY.
Babel.
Learn ES Babel.
Using Babel.
CLI Tools.
Plugins Babel.
Instalación de paquetes:
"presets": [ "env" ],
"plugins": []
"name": "taller-es",
"version": "1.0.0",
"main": "index.js",
"scripts": {
},
"devDependencies": {
"babel-cli": "^6.24.1",
"babel-core": "^6.25.0",
"babel-preset-env": "^1.6.0"
🔙 Regresar
if (true) {
};
Constantes
Una constantes es un tipo INMUTABLE, NO puede cambiar una vez definida, se usa la palabra const en lugar
de var, al igual que let su scope es de bloque, son tipos de sólo lectura y se le debe asignar un valor en el
https://jonmircha.com/ecmascript 2/22
19/5/22, 16:03 ECMAScript | jonmircha
momento de su declaración. Son referencias inmutables, pero sus valores no necesariamente.
DIEZ = 5;
const PI;
obj.prop = 'x';
obj.prop = 'y';
const D = document;
🔙 Regresar
Nivel de Bloques
En ES5 los ámbitos de declaración (scope) estaban diseñados a nivel de funciones, con ES6 podemos
declarar funciones a nivel de bloque.
En ES6, como en muchos otros lenguajes de programación, el bloque se define entre llaves y genera un
nuevo scope (block scope).
//Sin bloques
//Con bloques
🔙 Regresar
//strings multilínea
Batman`;
console.log(mensaje);
https://jonmircha.com/ecmascript 3/22
19/5/22, 16:03 ECMAScript | jonmircha
/*
Imprime
Batman
*/
//ejecutar expresiones
console.log(`Hola ${nombre}, tienes ${30 + 2} años`); //Imprime Hola Jonathan, tienes 32 años
//ejecutar funciones
ol = `<ol>
${
estaciones.map(function (estacion) {
return `<li>${estacion}</li>`;
}).join('')
</ol>`;
//función de etiquetado
};
etiqueta`Hola ${otroNombre}`;
🔙 Regresar
Funciones flecha
Es una nueva forma de definir funciones, hay distintas variantes en la sintaxis:
//Antes
};
//Ahora
//Antes
return a + b;
};
//Ahora
};
//Ahora
//Antes
hora = fecha.getHours();
if (hr <= 5) {
} else {
};
//Ahora
hora = fecha.getHours();
if (hr <= 5) {
} else {
};
//Antes
numeros.forEach(function (num) {
});
//Ahora
numeros.forEach((num) => {
});
function Persona(nombre) {
this.nombre = nombre;
this.edad = 0;
setInterval(function () {
//La función anónima define `this` como una instancia de ella misma
this.edad++;
https://jonmircha.com/ecmascript 5/22
19/5/22, 16:03 ECMAScript | jonmircha
}, 1000);
function Persona(nombre) {
//Se declara una variable self (algunos prefieren that) para guardar el `this` del constructor Persona()
self.nombre = nombre;
self.edad = 0;
setInterval(function () {
//La función anónima define su propio `this` pero el valor que aumenta es edad del `this` de Persona()
self.edad++;
}, 1000);
console.log(jon); //Imprime el valor de edad más uno por cada segundo que pasa
function Persona(nombre) {
this.nombre = nombre;
this.edad = 0;
setInterval(() => {
this.edad++;
}, 1000);
console.log(jon); //Imprime el valor de edad más uno por cada segundo que pasa
🔙 Regresar
Objetos literales
Atajos en la escritura de atributos y métodos:
//Antes
edad = 4;
var perro = {
nombre : nombre,
edad : edad,
ladrar : function () {
alert('guau guau!!!');
};
//Ahora
edad = 4;
const perro = {
nombre,
edad,
ladrar() {
alert('guau guau!!!');
};
https://jonmircha.com/ecmascript 6/22
19/5/22, 16:03 ECMAScript | jonmircha
let nombreAtributo = 'nombre',
nombreOtroAtributo = 'ad',
nombreMetodo = 'ladrar';
const perro = {
[nombreAtributo] : 'kEnAi',
[`ed${nombreOtroAtributo}`] : 4,
[nombreMetodo]() {
alert('guau guau!!!');
};
🔙 Regresar
Destructuración
Nuevas formas de asignar valores a Arreglos y Objetos.
//Destructuración de Arreglos
//sin destructuración
dos = numeros[1],
tres = numeros[2];
//con destructuración
//Destructuración de Objetos
🔙 Regresar
//Antes
function pais(nombre) {
console.log(nombre);
//Ahora
console.log(nombre);
https://jonmircha.com/ecmascript 7/22
19/5/22, 16:03 ECMAScript | jonmircha
pais(); //Imprime Terrestre
🔙 Regresar
Parámetros Rest
Los parámetros Rest son una forma de utilizar parámetros virtualmente infinitos, se definen agregando ...
adelante del nombre del parámetro rest, éste tiene que ser siempre el último parámetro de la función.
let resultado = a + b;
c.forEach(n => {
resultado += n;
});
return console.log(resultado);
sumar(1,2); //Imprime 3
sumar(1,2,3); //Imprime 6
sumar(1,2,3,4); //Imprime 10
sumar(1,2,3,4,5); //Imprime 15
🔙 Regresar
Operador de propagación
Permite que una expresión sea expandida en situaciones donde se esperan múltiples argumentos o
elementos.
console.log(...arr1); //Imprime 1 2 3 4
arr1.push(...arr2);
console.log(cuerpo); //Imprime ["cabeza", "hombros", "brazos", "tronco", "pelvis", "piernas", "rodillas", "pies"]
console.log(...cuerpo); //Imprime cabeza hombros brazos tronco pelvis piernas rodillas pies
🔙 Regresar
Clases
En ES se incorporan al lenguaje clases para poder hacer Programación Orientada a Objetos más facilmente
(sin prototipos), soportan herencia, polimorfismo, superclases, instancias, métodos estáticos, constructores,
setters y getters.
class Animal {
this.nombre = nombre;
this.edad = edad;
this.genero = genero;
comunicar() {
https://jonmircha.com/ecmascript 8/22
19/5/22, 16:03 ECMAScript | jonmircha
console.log('Me comunico con sonidos');
comer() {
console.log('Ingiero alimentos');
respirar() {
console.log('Respiro oxígeno');
reproducir() {
this.razonar = true;
this._nacionalidad = 'Terrestre';
static saludar() {
//Los setters y getters son métodos especiales que nos permiten establecer y obtener los valores de atributos de nuestra clase
set nacionalidad(pais) {
this._nacionalidad = pais;
get nacionalidad() {
return this._nacionalidad;
comunicar() {
comer() {
respirar() {
reproducir() {
pensar() {
console.log(jon); //Imprime Humano {nombre: "Jonathan", edad: 32, genero: "Macho", razonar: true, _nacionalidad: "Terrestre"}
console.log(jon); //Imprime Humano {nombre: "Jonathan", edad: 32, genero: "Macho", razonar: true, _nacionalidad: "México"}
https://jonmircha.com/ecmascript 9/22
19/5/22, 16:03 ECMAScript | jonmircha
🔙 Regresar
Módulos
Antes de ES6, utilizamos bibliotecas como Browserify para crear módulos en el lado del cliente
(navegadores), y require en el servidor (Node.js). Con ES, ahora podemos utilizar directamente módulos de
todos los tipos (AMD, CommonJS y ECMAScript).
Más información:
function sumar( a, b ) {
return a + b;
function restar( a, b ) {
return a - b;
return a + b;
return a - b;
Usando default:
function sumar( a, b ) {
return a + b;
function restar( a, b ) {
return a - b;
let operaciones = {
sumar,
restar
//otra forma
Mejores Prácticas: Utiliza siempre el método export default al final de módulos ECMAScript, esto
dejará claro lo que se está exportando y lo que no. En los módulos CommonJS suele exportarse un
sólo valor u objeto. Siguiendo con este paradigma, hacemos que nuestro código sea fácil, legible y
que podamos combinar entre módulos CommonJS y ECMAScript.
https://jonmircha.com/ecmascript 10/22
19/5/22, 16:03 ECMAScript | jonmircha
Importando en ECMAScript
Archivo completo:
import 'react';
import './libs/operaciones';
import {
sumar as mas,
restar as menos
} from './libs/operaciones';
Al importar un módulo exportado usando la sintaxis Commonjs (como React) podemos hacer lo siguiente:
Simplificando:
Nota: Los valores que se exportan son enlaces, no referencias. Por lo tanto, cambiar el enlace de una
variable en un módulo, afectará su valor. Evita cambiar la interfaz pública de módulos exportados.
🔙 Regresar
Promesas
Es una manera alternativa a las callbacks para modelar asincronía.
Promesas en el navegador
function adivinarNumero() {
setTimeout(() => {
}, 1000);
});
adivinarNumero()
https://jonmircha.com/ecmascript 11/22
19/5/22, 16:03 ECMAScript | jonmircha
Promesas en el servidor
const fs = require('fs'),
file = './nombres.txt',
newFile = './nombres_promises_es6.txt';
return (err)
: resolve(true);
});
});
promise
.then((dataPromise) => {
return (err)
: resolve(data);
});
});
})
.then((dataPromise) => {
return (err)
});
});
})
🔙 Regresar
Iteradores
Un Iterador es un mecanismo que tienen los lenguajes de programación para recorrer secuencialmente
distintas estructuras de datos.
Ejemplos de Iteradores:
Recorriendo iteradores con el bucle for...of, que permite recorrer objetos iterables:
//Antes
console.log( anArray[i] );
console.log( aString[i] );
//Ahora
https://jonmircha.com/ecmascript 12/22
19/5/22, 16:03 ECMAScript | jonmircha
aString = 'Hola soy iterable';
🔙 Regresar
Símbolos
Un Símbolo es un tipo de datos único e inmutable, puede ser utilizado como un identificador para las
propiedades de los objetos.
Son útiles cuando queremos agregar métodos o atributos propios a objetos nativos del lenguaje o a los de
alguna librería de terceros para evitar que, si existiése algún método o atributo con el nombre del que
queremos crear evitar que el original se sobre escriba con esto se evita un antipatrón.
Cuando se recorran las propiedades de un objeto, las que sean definidas como símbolo no aparecerán.
let anObject = {
name: 'Jonathan',
age: 36,
email: 'jonmircha@gmail.com'
},
//Un símbolo se instancia sin new, porque no es un objeto y por tal no tiene constructor
email = Symbol('email');
anObject[email] = 'hola@jonmircha.com';
console.log(
anObject, //Imprime Object {name: "Jonathan", age: 36, email: "jonmircha@gmail.com", Symbol(email): "hola@jonmircha.com"}
anObject.age, //Imprime 36
);
let iterable = {
0: 'Jonathan',
1: 36,
2: 'jonmircha@gmail.com',
length: 3,
[Symbol.iterator]: Array.prototype[Symbol.iterator]
};
🔙 Regresar
Generadores
https://jonmircha.com/ecmascript 13/22
19/5/22, 16:03 ECMAScript | jonmircha
Los generadores son un tipo especial de función que devuelve un valor y permite luego volver a entrar en la
función en el mismo lugar en que se quedó, al tiempo que conserva el contexto de ejecución.
Son funciones que pueden ser pausadas y resumidas cuando llamamos a la función generador, no ejecuta el
cuerpo de la función, sino que devuelve un objeto generador. El generador implementa una interfaz que le
proporciona un método next(), que ejecutará el cuerpo de la función hasta encontrar un yield. En este punto,
se detendrá.
El secreto del generador radica justamente en la palabra clave yield, que es un tipo especial de return que,
en lugar de devolver un solo valor y salirse de la función, entrará nuevamente en esta y continuará
ejecutándola hasta que se acabe o encuentre otra cláusula yield.
Para que una función se considere generador debe declararse anteponiento un asterísco function*.
Para obtener los resultados del generador lo hacemos con el método next() que devuelve un objeto de tipo:
Los generadores, al implementar .next(), son iterables y suelen ser una forma más sencilla de describir un
iterador.
function* generador(nombre) {
console.log( gen.next().value ); //Imprime Esta otra, saldrá en la cuarta solo si te llamas Jonathan
class LoremIpsum {
constructor( text ) {
this._text = text;
*words() {
const re = /\S+/g;
let match;
yield match[0];
const lorem = new LoremIpsum('Lorem ipsum dolor sit amet, consectetur adipisicing elit. Unde voluptatem eveniet ipsum in similique maxime sunt e
console.log( word );
class Usuarios {
constructor( gente ) {
this._gente = gente;
*alias() {
]);
console.log( persona );
https://jonmircha.com/ecmascript 14/22
19/5/22, 16:03 ECMAScript | jonmircha
🔙 Regresar
Proxies
Los proxies proporcionan una API para capturar o interceptar cualquier operación realizada sobre un objeto y
para modificar cómo se comporta ese objeto. Son útiles para:
Intercepción.
Virtualización de objetos.
Gestión de recursos.
Hacer profiling y generar logs durante la depuración de una aplicación.
Seguridad y control de acceso.
Definición de "contratos" al usar objetos.
Más información.
La API Proxy define un constructor 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:
El handler es el encargado de modificar el comportamiento original del objeto target. Este handler contiene
métodos "capturadores" ( por ejemplo .get(), .set(), .apply() ) que se ejecutan al realizar la llamada
correspondiente del proxy.
});
persona.edad = 33;
🔙 Regresar
Reflexión
Objeto global que proporciona funciones estáticas capaces de intereceptar operaciones de JavaScript, es
muy útil cuando se trabaja con proxies y de hecho, comparten muchos métodos.
La mayoría de sus métodos estáticos tienen una equivalencia en el objeto Object o Function.
ES5 ya incluye varias funcionalidades íntimamente relacionadas con la reflexión, como por ejemplo
Array.isArray() o Object.getOwnPropertyDescriptor().
ES6 introduce la API Reflection para agrupar todos estos métodos y los nuevos que se vayan definiendo.
const obj = { x: 1, y: 2 };
🔙 Regresar
https://jonmircha.com/ecmascript 15/22
19/5/22, 16:03 ECMAScript | jonmircha
Decoradores
Permiten anotar y modificar las clases y propiedades en tiempo de diseño. Mientras que en ES5 los objetos
literales admiten expresiones arbitrarias en la posición del valor, las clases de ES6 sólo admiten funciones
como valores literales, un decorador restaura la capacidad de ejecutar código en tiempo de diseño, mientras
se mantiene una sintaxis declarativa.
Un decorador:
Es una expresión.
Evalúa una función.
Toma el target, name y el descriptor del decorador como argumentos.
Opcionalmente retorna un descriptor del decorador para instalar en el objeto target.
Más Información.
Parámetros de un decorador:
descriptor.writable = false;
return descriptor;
};
class Persona {
this.nombre = nombre;
this.apellido = apellido;
@soloLectura
nombrar() {
nombre: 'Jonathan',
apellido: 'MirCha'
});
alguien.nombrar = () => {
return `${this.nombre}`;
🔙 Regresar
Funciones Asíncronas
Son una nueva característica soportada en ES, que nos permitirá realizar las mismas cosa que se pueden
lograr con Generadores y Promesas pero con menos esfuerzo.
Más Información:
Documentación MDN.
Async Functions.
function createUser(name) {
function getFriends(name) {
return 150;
https://jonmircha.com/ecmascript 16/22
19/5/22, 16:03 ECMAScript | jonmircha
friends = await getFriends(name);
if (friends !== 0) {
} else {
setNewUser('Jonathan');
En Node.js:
const fs = require('fs'),
file = './nombres.txt',
newFile = './nombres_async_es6.txt';
function accessFile(file) {
return (err)
});
function readFile(file) {
return (err)
: data;
});
return (err)
});
copyFile();
🔙 Regresar
.startsWith()
.endsWith()
.includes()
.repeat()
.normalize()
.raw()
.fromCodePoint()
.codePointAt()
🔙 Regresar
https://jonmircha.com/ecmascript 17/22
19/5/22, 16:03 ECMAScript | jonmircha
console.log(0o17); //Imprime 15
//binarios
console.log(0b100); //Imprime 4
🔙 Regresar
.acosh()
.asinh()
.atanh()
.cbrt()
.clz32()
.cosh()
.expm1()
.fround()
.hypot()
.imul()
.log10()
.log1p()
.log2()
.sign()
.sinh()
.tanh()
.trunc()
🔙 Regresar
.from()
.of()
.copyWithin()
.find()
.findIndex()
.fill()
.includes()
console.log( Array.from(nombre) ); //Imprime Array [ "J", "o", "n", "a", "t", "h", "a", "n" ]
https://jonmircha.com/ecmascript 18/22
19/5/22, 16:03 ECMAScript | jonmircha
console.log( Array(1, 2, 3) ); //Imprime [1, 2, 3]
console.log( ['a', 'b', 'c', 'd', 'e'] ); //Imprime ["a", "b", "c", "d", "e"]
console.log( ['a', 'b', 'c', 'd', 'e'].copyWithin(3, 0) ); //Imprime ["a", "b", "c", "a", "b"]
console.log( [20, 40, 100, 60, 80] ); //Imprime [20, 40, 100, 60, 80]
console.log( [20, 40, 100, 60, 80].find( n => n > 50 ) ); //Imprime 100
🔙 Regresar
.assign()
.values()
.entries()
const a = { a: 1 },
b = { b: 2 },
c = {};
Object.assign(c, a, b);
🔙 Regresar
Más información:
Map
WeakMap
Set
WeakSet
Map
El objecto Map nos permite relacionar (mapear) unos valores con otros como si fuera un diccionario, en
formato clave/valor. Cualquier valor (tanto objetos como valores primitivos) puede ser usados como clave o
valor.
Los Maps nos permiten saber de inmediato si existe una clave o borrar un par clave/valor concreto. Además,
podemos crear Maps a partir de un array de pares:
map.set('clave', 123);
map.set(user, 'Jonathan');
console.log( map ); //Imprime Map {"clave" => 123, Object {userId: 1} => "Jonathan"}
https://jonmircha.com/ecmascript 19/22
19/5/22, 16:03 ECMAScript | jonmircha
map.clear();
console.log( map.entries() ); //Imprime MapIterator {["user1", "Jonathan"], ["user2", "Irma"], ["user3", "kEnAi"]}
WeakMap
Los WeakMaps son similares a los Maps, pero con algunas diferencias:
Un WeakMap solo acepta objetos como claves, la referencia a las claves es débil, lo que significa que si no hay
otras referencias al objeto que actúa como clave, el recolector de basura podrá liberarlo.
Debido a que usa referencias débiles, un WeakMap NO dispone del método .keys() para recuperar las claves, NI
de propiedades o métodos relacionados con más de un elemento a la vez, como .values(), .entries(),
.clear() o .size.
clave2 = { userId: 2 },
weakmap.delete(clave);
Set
Los Sets son conjuntos de elementos no repetidos, que pueden ser tanto objetos, como valores primitivos.
Tiene métodos equivalentes a un Map, con la diferencia que utilizamos .add() para añadir elementos, y que las
keys y los values son lo mismo, el valor del objeto.
set.add('Jonathan');
set.add('Irma');
set.add('Irma');
console.log(item);
//Imprime Jonathan
//Imprime Irma
console.log(item);
https://jonmircha.com/ecmascript 20/22
19/5/22, 16:03 ECMAScript | jonmircha
set.delete('Jonathan');
set.clear();
WeakSet
Similar al WeakMap, pero con los Sets. Las dos principales diferencias de un WeakSet respecto a un Set son:
.add()
.delete()
.has()
weakset.add(objs);
weakset.delete(objs);
🔙 Regresar
📭 La lista de MirCha
Una vez al mes envío el contenido que escribo, grabo o produzco,
esperando pueda aportar valor
personal o profesional.
¿Te animas?
SÍ, me suscribo
https://jonmircha.com/ecmascript 21/22
19/5/22, 16:03 ECMAScript | jonmircha
¡Apóyame!
Paso la mayor parte de mi tiempo haciendo cursos y tutoriales
gratuitos
sobre desarrollo web.
🤗¡Muchas Gracias!🤗
https://jonmircha.com/ecmascript 22/22