Índice
- variables
- Funciones de flecha
- Instrumentos de cuerda
- matrices
- Matemáticas
- Operador de propagación
- Desestructurando
- Parámetros
Probablemente ya hayas oído hablar de ECMAScript 6 (o ES6). Es la próxima versión de JavaScript y tiene algunas características nuevas excelentes. Las funciones tienen distintos grados de complejidad y son útiles tanto en scripts simples como en aplicaciones complejas.
En este artículo, analizaremos una selección cuidadosamente seleccionada de características de ES6 que puede utilizar en su codificación JavaScript diaria. Tenga en cuenta que la compatibilidad con estas nuevas funciones de ECMAScript 6 está en marcha en los navegadores modernos, aunque la compatibilidad varía. Si necesita admitir versiones antiguas de navegadores que carecen de muchas funciones de ES6, mencionaré soluciones que podrían ayudarlo a comenzar a usar ES6 hoy.
La mayoría de los ejemplos de código vienen con un enlace externo "Ejecutar este código", para que puedas ver el código y jugar con él.
variables
dejar
Estás acostumbrado a declarar variables usando var
. Ahora let
también puedes usarlo . La sutil diferencia radica en el alcance. Si bien var
da como resultado una variable con la función circundante como alcance, el alcance de una variable declarada usando let
es solo el bloque en el que se encuentra.
if(true) { let x = 1;}console.log(x); // undefined
Esto puede generar un código más limpio, lo que resulta en menos variables dando vueltas. Tome esta iteración de matriz clásica:
for(let i = 0, l = list.length; i l; i++) { // do something with list[i]}console.log(i); // undefined
A menudo se utilizaría, por ejemplo, la j
variable para otra iteración en el mismo ámbito. Pero con let
, puedes i
volver a declarar con seguridad, ya que está definido y disponible solo dentro de su propio alcance de bloque.
constante
Hay otra forma de declarar variables con ámbito de bloque. Con const
, declaras una referencia de solo lectura a un valor. Debes asignar una variable directamente. Si intenta cambiar la variable o si no establece un valor inmediatamente, obtendrá un error:
const MY_CONSTANT = 1;MY_CONSTANT = 2 // Errorconst SOME_CONST; // Error
Tenga en cuenta que aún puede cambiar las propiedades del objeto o los miembros de la matriz:
const MY_OBJECT = {some: 1};MY_OBJECT.some = 'body'; // Cool
Funciones de flecha
Las funciones de flecha son una gran adición al lenguaje JavaScript. Crean un código breve y conciso. Introducimos las funciones de flecha al principio de este artículo para poder aprovecharlas en otros ejemplos más adelante. El siguiente fragmento de código muestra una función de flecha, con la misma función escrita en el estilo familiar de ES5:
let books = [{title: 'X', price: 10}, {title: 'Y', price: 15}];let titles = books.map( item = item.title );// ES5 equivalent:var titles = books.map(function(item) { return item.title;});
- Ejecute este código
Si nos fijamos en la sintaxis de las funciones de flecha, no hay ninguna function
palabra clave. Lo que queda es cero o más argumentos, la “flecha gruesa” (`=`) y la expresión de la función. La return
declaración se agrega implícitamente.
Con cero o más de un argumento, debes proporcionar paréntesis:
// No argumentsbooks.map( () = 1 ); // [1, 1]// Multiple arguments[1,2].map( (n, index) = n * index ); // [0, 2]
Coloque la expresión de la función en un bloque ( { ... }
) si necesita más lógica o más espacios en blanco:
let result = [1, 2, 3, 4, 5].map( n = { n = n % 3; return n;});
- Ejecute este código
Las funciones de flecha no sólo implican menos caracteres para escribir, sino que también se comportan de manera diferente a las funciones normales. Una expresión de función de flecha hereda this
y arguments
del contexto circundante. Esto significa que puede deshacerse de declaraciones desagradables como var that = this
y no necesitará vincular funciones al contexto correcto. Aquí hay un ejemplo (nota this.title
versus that.title
en la versión ES5):
let book = { title: 'X', sellers: ['A', 'B'], printSellers() { this.sellers.forEach(seller = console.log(seller + ' sells ' + this.title)); }}// ES5 equivalent:var book = { title: 'X', sellers: ['A', 'B'], printSellers: function() { var that = this; this.sellers.forEach(function(seller) { console.log(seller + ' sells ' + that.title) }) }}
- Ejecute este código
Instrumentos de cuerda
Métodos
Se han agregado un par de métodos convenientes al String
prototipo. La mayoría de ellos básicamente eliminan algunas soluciones con el indexOf()
método para lograr lo mismo:
'my string'.startsWith('my'); //true'my string'.endsWith('my'); // false'my string'.includes('str'); // true
Sencillo pero eficaz. Se ha agregado otro método conveniente para crear una cadena repetida:
'my '.repeat(3); // 'my my my '
Literal de plantilla
Los literales de plantilla proporcionan una forma limpia de crear cadenas y realizar interpolación de cadenas. Quizás ya estés familiarizado con la sintaxis; se basa en el signo del dólar y las llaves ${..}
. Los literales de plantilla están encerrados entre comillas invertidas. Aquí hay una demostración rápida:
let name = 'John', apples = 5, pears = 7, bananas = function() { return 3; }console.log(`This is ${name}.`);console.log(`He carries ${apples} apples, ${pears} pears, and ${bananas()} bananas.`);// ES5 equivalent:console.log('He carries ' + apples + ' apples, ' + pears + ' pears, and ' + bananas() +' bananas.');
- Ejecute este código
En la forma anterior, en comparación con ES5, son simplemente una conveniencia para la concatenación de cadenas. Sin embargo, los literales de plantilla también se pueden utilizar para cadenas de varias líneas. Tenga en cuenta que el espacio en blanco es parte de la cadena:
let x = `1...2...3 lines long!`; // Yay// ES5 equivalents:var x = "1...n" + "2...n" +"3 lines long!";var x = "1...n2...n3 lines long!";
- Ejecute este código
matrices
El Array
objeto ahora tiene algunos métodos de clase estáticos nuevos, así como nuevos métodos en el Array
prototipo. >Canastillas Bebe Gratis ¿Cómo se consiguen? ¿VERDAD O ENGAÑO?
Primero, Array.from
crea Array
instancias a partir de objetos iterables y similares a matrices. Ejemplos de objetos similares a matrices incluyen:
- el
arguments
dentro de una función; - un
nodeList
devuelto pordocument.getElementsByTagName()
; - las nuevas estructuras
Map
deSet
datos.
let itemElements = document.querySelectorAll('.items');let items = Array.from(itemElements);items.forEach(function(element) { console.log(element.nodeType)});// A workaround often used in ES5:let items = Array.prototype.slice.call(itemElements);
- Ejecute este código
En el ejemplo anterior, puede ver que la items
matriz tiene el forEach
método que no está disponible en la itemElements
colección.
Una característica interesante Array.from
es el segundo argumento opcional mapFunction
. Esto le permite crear una nueva matriz asignada en una sola invocación:
let navElements = document.querySelectorAll('nav li');let navTitles = Array.from(navElements, el = el.textContent);
- Ejecute este código
Luego tenemos Array.of
, que se comporta de forma muy parecida al Array
constructor. Soluciona el caso especial al pasarle un argumento de un solo número. Esto resulta en Array.of
ser preferible a new Array()
. Sin embargo, en la mayoría de los casos, querrás utilizar matrices literales.
let x = new Array(3); // [undefined, undefined, undefined]let y = Array.of(8); // [8]let z = [1, 2, 3]; // Array literal
Por último, pero no menos importante, se han añadido un par de métodos al Array
prototipo. Creo que los find
métodos serán bienvenidos para la mayoría de los desarrolladores de JavaScript.
find
devuelve el primer elemento para el cual regresa la devolución de llamadatrue
.findIndex
devuelve el índice del primer elemento para el cual devuelve la devolución de llamadatrue
.fill
"sobrescribe" los elementos de una matriz con el argumento dado.
[5, 1, 10, 8].find(n = n === 10) // 10[5, 1, 10, 8].findIndex(n = n === 10) // 2[0, 0, 0].fill(7) // [7, 7, 7][0, 0, 0, 0, 0].fill(7, 1, 3) // [0, 7, 7, 7, 0]
Matemáticas
Se han agregado un par de métodos nuevos al Math
objeto.
Math.sign
devuelve el signo de un número como1
,-1
o0
.Math.trunc
devuelve el número pasado sin dígitos fraccionarios.Math.cbrt
devuelve la raíz cúbica de un número.
Math.sign(5); // 1Math.sign(-9); // -1Math.trunc(5.9); // 5Math.trunc(5.123); // 5Math.cbrt(64); // 4
Si desea obtener más información sobre las nuevas funciones numéricas y matemáticas de ES6 , el Dr. Axel Rauschmayer lo tiene cubierto.
Operador de propagación
El operador de extensión ( ...
) es una sintaxis muy conveniente para expandir elementos de una matriz en lugares específicos, como argumentos en llamadas a funciones. Mostrarle algunos ejemplos es probablemente la mejor manera de demostrar lo útiles que son.
Primero, veamos cómo expandir elementos de una matriz dentro de otra matriz:
let values = [1, 2, 4];let some = [...values, 8]; // [1, 2, 4, 8]let more = [...values, 8, ...values]; // [1, 2, 4, 8, 1, 2, 4]// ES5 equivalent:let values = [1, 2, 4];// Iterate, push, sweat, repeat...// Iterate, push, sweat, repeat...
- Ejecute este código
La sintaxis extendida también es poderosa cuando se llaman funciones con argumentos:
let values = [1, 2, 4];doSomething(...values);function doSomething(x, y, z) { // x = 1, y = 2, z = 4}// ES5 equivalent:doSomething.apply(null, values);
- Ejecute este código
Como puede ver, esto nos salva de la fn.apply()
solución alternativa que se utiliza con frecuencia. La sintaxis es muy flexible porque el operador de extensión se puede utilizar en cualquier parte de la lista de argumentos. Esto significa que la siguiente invocación produce el mismo resultado:
let values = [2, 4];doSomething(1, ...values);
- Ejecute este código
Hemos estado aplicando el operador de extensión a matrices y argumentos. De hecho, se puede aplicar a todos los objetos iterables, como NodeList
:
let form = document.querySelector('#my-form'), inputs = form.querySelectorAll('input'), selects = form.querySelectorAll('select');let allTheThings = [form, ...inputs, ...selects];
- Ejecute este código
Ahora, allTheThings
es una matriz plana que contiene el form
nodo y sus input
nodos select
secundarios.
Desestructurando
La desestructuración proporciona una forma conveniente de extraer datos de objetos o matrices. Para empezar, se puede dar un buen ejemplo utilizando una matriz:
let [x, y] = [1, 2]; // x = 1, y = 2// ES5 equivalent:var arr = [1, 2];var x = arr[0];var y = arr[1];
Con esta sintaxis, se puede asignar un valor a varias variables de una sola vez. Un buen efecto secundario es que puedes intercambiar fácilmente valores de variables:
let x = 1, y = 2;[x, y] = [y, x]; // x = 2, y = 1
- Ejecute este código
La desestructuración también funciona con objetos. Asegúrese de tener claves coincidentes:
let obj = {x: 1, y: 2};let {x, y} = obj; // x = 1, y = 2
- Ejecute este código
También puedes usar este mecanismo para cambiar los nombres de las variables:
let obj = {x: 1, y: 2};let {x: a, y: b} = obj; // a = 1, b = 2
Otro patrón interesante es simular múltiples valores de retorno:
function doSomething() { return [1, 2]}let [x, y] = doSomething(); // x = 1, y = 2
- Ejecute este código
La desestructuración se puede utilizar para asignar valores predeterminados a objetos de argumento. Con un objeto literal, puedes simular parámetros con nombre.
function doSomething({y = 1, z = 0}) { console.log(y, z);}doSomething({y: 2});
Parámetros
Valores predeterminados
En ES6, los medidores definen valores predeterminados para la función paraposible. La sintaxis es la siguiente:
function doSomething(x, y = 2) { return x * y;}doSomething(5); // 10doSomething(5, undefined); // 10doSomething(5, 3); // 15
- Ejecute este código
Se ve bastante limpio, ¿verdad? Estoy seguro de que has necesitado completar algunos argumentos en ES5 antes:
function doSomething(x, y) { y = y === undefined ? 2 : y; return x * y;}
Cualquier undefined
argumento o ningún argumento activa el valor predeterminado para ese argumento.
Parámetros de descanso
Hemos estado investigando al operador de propagación. Los parámetros de descanso son muy similares. También utiliza la ...
sintaxis y le permite almacenar argumentos finales en una matriz:
function doSomething(x, ...remaining) { return x * remaining.length;}
Como puede ver, esto nos salva de la fn.apply()
solución alternativa que se utiliza con frecuencia. La sintaxis es muy flexible porque el operador de extensión se puede utilizar en cualquier parte de la lista de argumentos. Esto significa que la siguiente invocación produce el mismo resultado:
sean valores = [2, 4]; hacer algo(1, ...valores);- Ejecute este código
Hemos estado aplicando el operador de extensión a matrices y argumentos. De hecho, se puede aplicar a todos los objetos iterables, como NodeList
:
let form = document.querySelector('#my-form'), inputs = form.querySelectorAll('input'), selects = form.querySelectorAll('select');let allTheThings = [form, ...inputs, ...selects];
- Ejecute este código
Ahora, allTheThings
es una matriz plana que contiene el
Tal vez te puede interesar:
- ¿Deberían abrirse los enlaces en ventanas nuevas?
- 24 excelentes tutoriales de AJAX
- 70 técnicas nuevas y útiles de AJAX y JavaScript
- Más de 45 excelentes recursos y repositorios de fragmentos de código
ECMAScript 6 (ES6): novedades de la próxima versión de JavaScript
variablesFunciones de flechaInstrumentos de cuerdamatricesMatemáticasOperador de propagaciónDesestructurandoParámetros¡Registro! Diseño de arquitectura d
programar
es
https://aprendeprogramando.es/static/images/programar-ecmascript-6-es6-novedades-de-la-proxima-version-de-javascript-858-0.jpg
2024-12-03
Si crees que alguno de los contenidos (texto, imagenes o multimedia) en esta página infringe tus derechos relativos a propiedad intelectual, marcas registradas o cualquier otro de tus derechos, por favor ponte en contacto con nosotros en el mail [email protected] y retiraremos este contenido inmediatamente