Características de JavaScript moderno que quizás no conozcas



A pesar de que en los últimos siete años escribo en JavaScript casi todos los días hábiles, debo admitir que presto poca atención a las noticias sobre las innovaciones de ES. Las características principales como async / await y proxies son una cosa, pero cada año hay una serie de pequeños cambios por fases que no entran en mi campo de visión, porque siempre hay algo más importante para estudiar.

En este artículo, he reunido las capacidades de los JS modernos, de los que no se habló mucho cuando aparecieron. Algunos de ellos solo aumentan la usabilidad, y otros son increíblemente prácticos y pueden ahorrarle escribir un montón de código.

ES2015


Literales binarios y octales


JavaScript no suele tener que usar manipulación binaria. Pero a veces surgen tareas que no pueden resolverse de otra manera. Por ejemplo, cuando escribe código de alto rendimiento para dispositivos débiles, inserta bits en el almacenamiento local, realiza manipulaciones de píxeles RGB en un navegador o trabaja con formatos de datos binarios muy compactos.

Todo esto puede requerir mucho trabajo para ocultar / combinar números binarios; Siempre me pareció que estaban en vano escondidos en decimales. Para tales casos, el formato literal binario se agregó a ES6: 0b .

 const binaryZero = 0b0; const binaryOne = 0b1; const binary255 = 0b11111111; const binaryLong = 0b111101011101101; 

Esto simplifica enormemente el trabajo con banderas binarias:

 // Pizza toppings const olives = 0b0001; const ham = 0b0010; const pineapple = 0b0100; const artechoke = 0b1000; const pizza_ham_pineapple = pineapple | ham; const pizza_four_seasons = olives | ham | artechoke; 

Lo mismo con los números octales. En el mundo JS, esta es una oportunidad de nicho, pero a menudo se usan para redes y algunos formatos de archivo. Puede escribir números octales utilizando la sintaxis 0o .

Number.isNaN ()


No debe confundirse con window.isNaN() , este es un nuevo método con un comportamiento mucho más intuitivo.

El clásico isNaN tiene algunos trucos interesantes:

 isNaN(NaN) === true isNaN(null) === false isNaN(undefined) === true isNaN({}) === true isNaN('0/0') === true isNaN('hello') === true 

¿Qué nos da esto? En primer lugar, ninguno de estos parámetros es en realidad NaN . Como de costumbre, el problema está en todas las propiedades de JavaScript "favoritas": conversión de tipos. Los argumentos para window.isNaN se window.isNaN a números usando la función Number .

El nuevo Number.isNaN() estático Number.isNaN() resuelve este problema. Él de una vez por todas devuelve la igualdad de los argumentos pasados ​​a él y NaN . Esto es absolutamente claro:

 Number.isNaN(NaN) === true Number.isNaN(null) === false Number.isNaN(undefined) === false Number.isNaN({}) === false Number.isNaN('0/0') === false Number.isNaN('hello') === false 

Firma: Number.isNaN : (value: any) => boolean

ES2016


Operador de exponenciación


Esto sucede de vez en cuando, por lo que es bueno tener una sintaxis literal a mano para la exponenciación:

 2**2 === 4 3**2 === 9 3**3 === 27 

Extraño, pero estaba seguro de que esto ya existe en JavaScript. Quizás confundido con Python.

Array.prototype.includes ()


Fue difícil array.indexOf(x) !== -1 por alto, pero si escribiste array.indexOf(x) !== -1 en los últimos tres años, regocíjate con el nuevo método de array.indexOf(x) !== -1 :

 [1, 2, 3].includes(2) === true [1, 2, 3].includes(true) === false 

includes utiliza el algoritmo Same Value Zero , que es casi idéntico a la comprobación estricta de igualdad ( === ), excepto que puede manejar valores NaN . Este algoritmo también compara objetos por enlaces en lugar de contenidos:

 const object1 = {}; const object2 = {}; const array = [object1, 78, NaN]; array.includes(object1) === true array.includes(object2) === false array.includes(NaN) === true 

includes puede tomar un segundo parámetro, fromIndex , que le permite proporcionar un valor de cambio:

 // positions 0 1 2 3 4 const array = [1, 1, 1, 2, 2]; array.includes(1, 2) === true array.includes(1, 3) === false 

Útil

Firma: Array.prototype.includes : (match: any, offset?: Int) => boolean

ES2017


Memoria compartida y operaciones atómicas.


Estas son algunas de las excelentes características que son simplemente invaluables si necesita hacer mucho trabajo con los trabajadores web. Puede compartir memoria directamente con múltiples procesos y establecer bloqueos para evitar condiciones de carrera.

Estas son dos excelentes funciones con API bastante complejas, por lo que no las describiré aquí. Para más detalles, envíelo a este artículo: https://www.sitepen.com/blog/the-return-of-sharedarraybuffers-and-atomics/ . No todos los navegadores admiten estas características todavía, pero espero que la situación mejore en los próximos años.

ES2018


Mina de oro de expresiones regulares


ES2018 tiene un montón de nuevas características de expresión regular:

Partidas secundarias (coincidencia con caracteres anteriores)


En tiempos de ejecución que admiten esto, ahora puede escribir expresiones regulares que busquen caracteres antes de que coincidan. Por ejemplo, para encontrar todos los números precedidos por un signo de dólar:

 const regex = /(?<=\$)\d+/; const text = 'This cost $400'; text.match(regex) === ['400'] 

Se trata del nuevo grupo de lookbehind, los grupos gemelos de lookahead:

 Look ahead: (?=abc) Look behind: (?<=abc) Look ahead negative: (?!abc) Look behind negative: (?<!abc) 

Desafortunadamente, hoy no puede traducir la nueva sintaxis de retrospectiva para navegadores antiguos, por lo que es muy posible que solo pueda usarla en Node por un tiempo.

Grupos de captura nombrados


Las expresiones regulares ahora pueden seleccionar submuestras y usar para un análisis simple. Hasta hace poco, podíamos referirnos a dichos fragmentos solo por números, por ejemplo:

 const getNameParts = /(\w+)\s+(\w+)/g; const name = "Weyland Smithers"; const subMatches = getNameParts.exec(name); subMatches[1] === 'Weyland' subMatches[2] === 'Smithers' 

Y ahora existe la sintaxis para nombrar estas submuestras (o grupos de registros): dentro de los corchetes al principio ponemos ?<titl> , si queremos darle un nombre al grupo:

 const getNameParts = /(?<first>\w+)\s(?<last>\w+)/g; const name = "Weyland Smithers"; const subMatches = getNameParts.exec(name); const {first, last} = subMatches.groups first === 'Weyland' last === 'Smithers' 

Desafortunadamente, esto solo funciona en Chrome y Node ahora.

Ahora los puntos pueden marcar nuevas líneas


Solo es necesario colocar la bandera /s , por ejemplo, /someRegex./s , /anotherRegex./sg .

ES2019


Array.prototype.flat () y flatMap ()


Estaba muy feliz de ver esto en MDN.

En pocas palabras, flat() convierte una matriz multidimensional en una matriz unidimensional a una profundidad máxima dada:

 const multiDimensional = [ [1, 2, 3], [4, 5, 6], [7,[8,9]] ]; multiDimensional.flat(2) === [1, 2, 3, 4, 5, 6, 7, 8, 9] 

flatMap es un map seguido de flat con una profundidad de 1. Esto es útil si necesita asignar una función que devuelve una matriz, pero no necesita que el resultado sea una estructura de datos anidada:

 const texts = ["Hello,", "today I", "will", "use FlatMap"]; // with a plain map const mapped = texts.map(text => text.split(' ')); mapped === ['Hello', ['today', 'I'], 'will', ['use', 'FlatMap']]; // with flatmap const flatMapped = texts.flatMap(text => text.split(' ')); flatMapped === ['Hello', 'today', 'I', 'will', 'use', 'FlatMap']; 

Captura ilimitada


Ahora puede escribir expresiones try / catch sin referencia a errores de lanzamiento:

 try { // something throws } catch { // don't have to do catch(e) } 

Por cierto, los ganchos en los que no tienes en cuenta el valor de e veces se denominan manejo de excepciones de Pokémon . ¡Porque tienes que atraparlos a todos!

Métodos de recorte de valor de cadena


Ligeramente, pero agradable:

 const padded = ' Hello world '; padded.trimStart() === 'Hello world '; padded.trimEnd() === ' Hello world'; 

Source: https://habr.com/ru/post/473816/


All Articles