Código inteligente! Conviértete en un desarrollador de JavaScript más rápido, más productivo y más feliz dominando estas características más importantes y recurrentes del idioma.
Ya sea que se trate de backend o interfaz (o incluso naves espaciales), JavaScript está en todas partes. También es un lenguaje bastante flexible (lo que significa que tiene complejos patrones de programación funcional, así como buenas clases a la antigua), y sus similitudes con otros idiomas «similares a C» facilitan que los desarrolladores pasen de otros idiomas.
Si quieres bombear tu juego JS, te sugiero que aprendas, practiques y eventualmente domine las siguientes características básicas disponibles en el idioma. No todos son estrictamente «necesarios» para resolver problemas, pero en algunos casos pueden hacer gran parte del trabajo pesado por usted, y en otros pueden reducir la cantidad de código que necesita escribir.
mapa().
¡Sería herejía escribir un artículo sobre importantes funciones de JavaScript y no mencionar el mapa ()!😆😆 junto con filtro () y reducir (), map () forma una especie de santa trinidad. Estas son funciones que usará una y otra vez en su carrera, por lo que son más que dignos de atención. Veamos a través de ellos uno por uno, comenzando con map ().
MAP () es una de esas funciones que causan más problemas para las personas que aprenden JavaScript.¿Por qué? No porque tenga algo inherentemente complejo, sino porque la forma en que funciona esta función es una idea tomada de la llamada programación funcional. Y debido a que no estamos familiarizados con la programación funcional, nuestras escuelas y la industria están llenas de lenguajes orientados a objetos, el trabajo parece extraño o incluso incorrecto para nuestros cerebros sesgados.
JavaScript es mucho más funcional que orientado a objetos, aunque sus versiones modernas hacen todo lo posible para ocultar ese hecho. Pero esa es toda una lata de gusanos que puedo abrir, tal vez algún día.🤣 Entonces, mapa ()….
MAP () es una función muy simple; Se adhiere a una matriz y nos ayuda a convertir cada elemento en otra cosa, lo que resulta en una nueva matriz. Cómo convertir exactamente un elemento se proporciona como otra función, que por convención es anónima.
¡Eso es todo! La sintaxis puede tardar un tiempo en acostumbrarse, pero eso es esencialmente lo que estamos haciendo en MAP ().¿Por qué podríamos querer usar map ()? Depende de lo que estemos tratando de lograr. Por ejemplo, supongamos que registramos la temperatura para cada día de la última semana y la almacenamos como una matriz simple. Sin embargo, ahora se nos dice que los instrumentos no eran muy precisos y mostraron la temperatura de 1, 5 grados más bajas de lo que debería haber sido.
Podemos hacer esta corrección usando MAP () de la siguiente manera:
const weeklyReadings = [20, 22, 20.5, 19, 21, 21.5, 23]; const correctedWeeklyReadings = weeklyReadings.map(reading =>lectura + 1. 5); console. log (corregidoweeklyreadings);// da [21. 5, 23. 5, 22, 20. 5, 22. 5, 23, 24. 5].
Otro ejemplo muy práctico se toma del mundo React, donde la creación de listas de elementos DOM a partir de matrices es un patrón común; Entonces, algo como esto es común:
Exportar predeterminado (< products >) => < return products.map(product =>< return ( > ); >); >;
Aquí tenemos un componente funcional React que obtiene una lista de productos como accesorio. Luego, a partir de esa lista (matriz), se crea una lista de elementos HTML DIV, esencialmente convirtiendo cada objeto de producto en HTML. El objeto de producto original permanece intacto.
Puede argumentar que MAP () no es más que un glorificado para Loop, y estaría absolutamente correcto. Pero observe que tan pronto como hagas ese argumento, tu mente entrenada orientada a objetos comienza a hablar, mientras que estas funciones y su lógico provienen de la programación funcional, donde la uniformidad, la compacidad y la elegancia son muy valoradas.🙂 🙂
filtrar()
Filter () es una función muy útil que usará una y otra vez en muchas situaciones. Como su nombre indica, esta función filtra una matriz basada en las reglas/lógica que especifique y devuelve una nueva matriz que contiene elementos que satisfacen esas reglas.
Reutilicemos nuestro ejemplo del clima. Supongamos que tenemos una matriz que contiene las temperaturas máximas para cada día de la semana pasada; Ahora queremos averiguar cuántos de esos días eran más fríos. Sí, «más frío» es un término subjetivo, así que digamos que estamos buscando días en los que la temperatura fue inferior a 20. Podemos hacerlo usando la función Filter () de la siguiente manera:
const weeklyReadings = [20, 22, 20.5, 19, 21, 21.5, 23]; const colderDays = weeklyReadings.filter(dayTemperature => < return dayTemperature < 20; >); console. log ("Los días más fríos en la semana fueron:" + ColderDays. length);// 1
Tenga en cuenta que la función anónima que pasamos a filtrar () debe devolver un valor booleano: Verdadero o Falso. Así es como Filter () sabe si incluir este elemento en la matriz filtrada. Puede escribir cualquier lógica compleja que desee dentro de esta función anónima; Puede hacer llamadas de API y leer la entrada del usuario, etc., siempre que se asegure de devolver un valor lógico al final.
PRECAUCIÓN: Esta es una nota que me veo obligado a hacer en función de mi experiencia como desarrollador de JavaScript. Ya sea debido al descuido o los fundamentos incorrectos, muchos programadores crean errores sutiles en sus programas al usar Filter (). Reescribamos el código anterior para contener el error:
const weeklyReadings = [20, 22, 20.5, 19, 21, 21.5, 23]; const colderDays = weeklyReadings.filter(dayTemperature => < return dayTemperature < 20; >); if (fryerdays)< console.log("Yes, there were colder days last week"); >demás
¿Te das cuenta de algo?¡Buen trabajo si lo hicieras!¡La cláusula IF cerca del final verifica los días fríos, lo cual es en realidad una matriz! Te sorprendería cuántas veces las personas cometen este error al tratar de cumplir con una fecha límite o codificar de mal humor (por cualquier razón). El problema con esta condición es que JavaScript es un lenguaje extraño e inconsistente en muchos sentidos, y la «veracidad» de las cosas es una de ellas. Mientras que [] == True Devuelve falso, haciéndole pensar que el código anterior no está roto, la realidad es que dentro de la condición IF, [] se evalúa como verdadero! En otras palabras, el código que escribimos nunca dirá que no hubo días más fríos la semana pasada.
La solución es muy simple, como se indica en el código antes del código anterior. Verificamos el valor de los días más fríos. Tenga en cuenta que Filter () siempre, siempre, siempre devolverá una matriz, vacía o no vacía, para que podamos confiar en esto y escribir nuestras comparaciones booleanas con confianza.
Este fue un gancho más largo de lo que planeé, pero vale la pena resaltar errores como este en diez mil palabras, capitalizados si es necesario.¡Espero que no te muerda, y ahorras cientos de horas de esfuerzo de depuración!🙂 🙂
reducir()
De todas las funciones en este artículo, y en la Biblioteca estándar de JavaScript, Reduce () es uno de los primeros contendientes por el título de «confuso y extraño». Aunque esta función es muy importante y conduce a un código elegante en muchas situaciones, la mayoría de los desarrolladores de JavaScript la evitan y prefieren escribir un código más detallado.
La razón es que, ¡y seré honesto aquí!- Reducir () es difícil de entender tanto en términos de concepto como de ejecución. Cuando lees su descripción, la vuelves a leer varias veces y aún así dudas si la lees correctamente; Y cuando lo ves en acción e intentas visualizar cómo funciona, ¡tu cerebro se gira en mil nudos!🤭
No se deje intimidar. La función Reder () no es tan compleja e intimidante como, por ejemplo, los árboles B+ y sus algoritmos. Es solo que este tipo de lógica rara vez se ve en el trabajo diario de un programador ordinario.
Entonces, habiendo asustado la mitad de muerte e inmediatamente le dije que no se preocupe, me gustaría finalmente mostrarle cuál es esta función y por qué podemos necesitarla.
Como su nombre lo indica, Reduce () se usa para reducir algo. Lo que reduce es una matriz, y a qué reduce esa matriz es un valor único (número, cadena, función, objeto, lo que sea). Aquí hay una forma más simple de expresarlo: reducir () convierte una matriz a un solo valor. Tenga en cuenta que el valor de retorno de Reduce () no es una matriz, como con MAP () y Filter (). Comprender esto es la mitad de la batalla 🙂 🙂
Ahora, obviamente, si vamos a transformar (reducir) una matriz, necesitamos proporcionar la lógica necesaria; Y según su experiencia como desarrollador de JS, probablemente ya haya adivinado que hacemos esto con una función. Llamamos a esta función la función reductor, que forma el primer argumento de Reduce (). El segundo argumento es un valor inicial como un número, cadena, etc. (un poco más tarde explicaré cuál es este «valor inicial»).
Según nuestro entendimiento, podemos decir que la llamada para reducir () se ve así: Array. Reduce (reductorfunction, StartValue). Ahora vamos al corazón de todo: la función reductor. Como se mencionó, la función reductor es lo que le dice al método Rede () cómo convertir una matriz en un solo valor. Se necesitan dos argumentos: una variable que actúa como un acumulador (no se preocupe, lo explicaré también) y una variable para almacenar el valor actual.
Sé que sé … Esa fue mucha terminología para una función que ni siquiera se requiere en JavaScript.😝😝 Y es por eso que las personas huyen del método Red (). Pero si lo aprende paso a paso, no solo lo entenderá, sino que lo apreciará a medida que se convierta en un mejor desarrollador.
Entonces, volvamos al tema en cuestión.»Valor inicial» pasado para reducir () es igual a… Bueno, el valor inicial para el cálculo que desea usar. Por ejemplo, si va a realizar la multiplicación en una función reductor, un valor inicial de 1 tiene sentido; Para además, puede comenzar en 0, y así sucesivamente.
Ahora veamos la firma de la función reductor. La función reductora pasada al método Rede () es la siguiente: ReducerFunction (Acumulator, CurrentValue).»Acumulador» es solo un nombre elegante para una variable que recopila y almacena el resultado de un cálculo; Es como usar una variable llamada Total para sumar todos los elementos en una matriz, usando algo como Total += arr [i]. Esto es exactamente como se usa la función reductora en Reduce (): inicialmente, el valor inicial que especifique se establece en el acumulador, y luego uno por uno se visitan los elementos de la matriz, el cálculo se realiza y el resultado se almacenaen el acumulador, y así sucesivamente….
Entonces, ¿cuál es este «valor actual» en una función reductor? Es la misma idea que visualizaría mentalmente si le pidiera que caminara a través de una matriz: tome una variable, comenzando en el índice cero, y la avanza un paso a la vez. Mientras haces eso, si te pedía que te detuvieras de repente, terminarías en uno de los elementos de la matriz, ¿verdad? Esto es lo que queremos decir con valor actual: es el valor de la variable utilizada para representar el elemento de matriz que está considerando actualmente (piense en la enumeración de la matriz, si eso ayuda).
Dicho todo eso, es hora de ver un ejemplo simple y ver cómo toda esta jerga se une en una llamada Rede () real. Digamos que tenemos una matriz que contiene los primeros n números naturales (1, 2, 3 … n) y necesitamos encontrar el factorial de n.¡Sabemos qué encontrar! Solo necesitamos multiplicar todo, lo que nos lleva a esta realización:
const numbers = [1, 2, 3, 4, 5]; const factorial = numbers.reduce((acc, item) =>ACC * Artículo, 1); console. log (factorial);// 120
Многое происходит в этих трех строках кода, поэтому давайте раскроем их одну за другой в контексте (очень долгого) обсуждения, которое у нас было до сих пор. Очевидно, что numbers — это массив, содержащий все числа, которые мы хотим перемножить. Затем взгляните на вызов number.reduce(), в котором говорится, что начальное значение для acc должно быть 1 (поскольку оно не влияет на умножение и не уничтожает его). Затем проверьте тело функции редуктора, `(acc, item) =>El elemento acc *, que simplemente dice que el valor de retorno para cada iteración a través de la matriz debe ser ese elemento multiplicado por lo que sea que ya esté en el acumulador. Iterando y almacenando explícitamente la multiplicación en el acumulador es lo que sucede detrás de escena, y es una de las principales razones por las cuales el método Reduce () es un bloque tan tropezante para los desarrolladores de JavaScript.
¿Por qué usar Reduce ()?
Esa es una gran pregunta y, sinceramente, no tengo una respuesta exacta. Lo que sea que reduzca (), puede hacerlo con bucles, foreach (), etc. Sin embargo, estos métodos dan como resultado mucho más código, lo que hace que sea difícil de leer, especialmente si tiene prisa. También existe el problema de inmutabilidad: con funciones Reduce () y similares, puede estar seguro de que sus datos originales no han cambiado; Esto solo elimina clases completas de errores, especialmente en aplicaciones distribuidas.
Finalmente, el método reducir () es mucho más flexible en el sentido de que el acumulador puede ser un objeto, una matriz o incluso una función si es necesario; Lo mismo ocurre con el valor inicial y otras partes de la llamada de función: casi cualquier cosa puede ser entrada y casi cualquier cosa puede recuperarse, por lo que hay una flexibilidad extrema al desarrollar un código reutilizable.
Si todavía no estás convencido, eso también está perfectamente bien; La comunidad JavaScript misma está muy dividida sobre la «compacidad», la «elegancia» y el «poder» del método Red (), por lo que está bien si no lo usa.🙂 Pero asegúrese de mirar algunos ejemplos ordenados antes de decidir reducir ().
un poco()
Supongamos que tiene una variedad de objetos, cada uno que representa a una persona. Desea saber si hay personas mayores de 35 años en la matriz. Tenga en cuenta que no hay necesidad de contar el número de tales personas, y mucho menos obtener una lista de ellas. Lo que estamos diciendo aquí es el equivalente de «uno o más» o «al menos uno».
¿Cómo haces esto?
Sí, puede crear una variable de bandera y recorrer la matriz para resolver este problema de la siguiente manera:
PERSONES DE CONSTRUCCIÓN = [< name: 'Person 1', age: 32 >, < name: 'Person 2', age: 40 >,]; LetEdsedOver35 = false; para (deja i = 0; yo< persons.length; i ++) < if(persons[i].age >35)< foundOver35 = true; break; >>if (FUNDOVER35
¿El problema? En mi opinión, el código se parece demasiado a C o Java. Otra palabra que me viene a la mente es «textual». Un JS experimentado puede pensar en «feo», «horrible», etc. 😝 y con razón, diría. Una forma de mejorar este código es usar algo como Map (), pero incluso entonces la solución es un poco torpe.
Resulta que tenemos una función bastante ingeniosa, algunos () ya disponibles en el idioma principal. Esta función funciona con matrices y toma una función de «filtro» personalizada, devolviendo un valor booleano de verdadero o falso. Esencialmente hace lo que hemos estado tratando de hacer durante los últimos minutos, solo de una manera muy concisa y elegante. Así es como podemos usarlo:
PERSONES DE CONSTRUCCIÓN = [< name: 'Person 1', age: 32 >, < name: 'Person 2', age: 40 >, ]; if(persons.some(person => < return person.age >35 >))
Misma entrada, el mismo resultado que antes;¡Pero observe la dramática reducción del código!¡Observe también cuán dramáticamente se reduce la carga cognitiva, porque ya no tenemos que analizar el código por línea, como si fuéramos los intérpretes nosotros mismos! El código ahora se lee casi como el lenguaje natural.
cada()
Como con algunos (), tenemos otra función útil llamada cada (). Como habrás adivinado, esto también devuelve un valor booleano dependiendo de si todos los elementos en la matriz pasan una prueba dada. Por supuesto, la prueba de aprobación se proporciona principalmente como una función anónima. Te ahorraré la agonía de cómo podría ser una versión ingenua del código, así que así es como se usa cada ():
Const Entries = [< id: 1 >, < id: 2 >, < id: 3 >, ]; if(entries.every(entry => < return Number.isInteger(entry.id) && entry.id >0; >))
Como puede ver, el código verifica todas las entradas en la matriz para una propiedad de identificación válida. La definición de «válido» depende del contexto del problema, pero como puede ver, para este código consideré enteros no negativos. Una vez más, vemos cuán simple y elegante se lee el código, que es el único propósito de estas funciones (y similares).
incluir()
¿Cómo se verifica las subcadenas y los elementos de matriz? Bueno, si eres como yo, llegas a indexOf () rápidamente y luego mira los documentos para averiguar los posibles valores de retorno. Este es un inconveniente significativo, y los valores de retorno son difíciles de recordar (rápido, ¿qué significa un proceso que devuelve un sistema operativo 2?).
Pero hay una buena alternativa que podemos usar: incluir (). El uso es tan simple como el nombre, y el código resultante es extremadamente conmovedor. Tenga en cuenta que el mapeo realizado con incluir () es sensible a los casos, pero creo que todos lo esperamos intuitivamente de todos modos.¡Ahora es el momento de algún código!
Const números = [1, 2, 3, 4, 5]; console. log (números. includes (4)); const name = "ankush"; console. log (name. includes ('ank'));// falso, porque la primera letra está en la consola de caps pequeños. log (name. includes ('ank'));// Verdadero, como se esperaba
Sin embargo, no esperes demasiado de este modesto método:
constante user =; console. log (user. includes ('a'));// explota, ya que los objetos no tienen un método "incluye"
No puede mirar dentro de los objetos, ya que simplemente no está definido para objetos. Pero bueno, sabemos que funciona con matrices, así que tal vez podamos experimentar un poco aquí…🤔.
const personas = [,]; personas. includes ();
Entonces, ¿qué sucede cuando ejecuta este código? No explota, pero la salida también es decepcionante: falso.😫😫 Esto realmente tiene que ver con objetos, punteros y cómo JavaScript ve y administra la memoria, y ese es un mundo separado. Si quieres sumergirte más profundo, siéntete libre de dar un paso drástico (tal vez comience aquí), pero me detendré aquí.
Podemos hacer que el código anterior funcione si lo reescribimos de la siguiente manera, pero en este punto creo que más o menos se convierte en una broma:
const Phil =; const personas = [Phil,]; personas. Incrusiones (Phil);// verdadero
Aún así, esto muestra que podemos hacer que incluya () funcionar con objetos, así que supongo que no es un desastre completo.😄
rebanada().
Supongamos que tenemos una cadena, y le pido que devuelva la parte de ella comenzando con «R» y que termine con «Z» (los personajes reales no importan).¿Cómo te acercarías a esto? Tal vez crearía una nueva cadena y la usaría para almacenar todos los caracteres que necesita y devolverlos. O, si eres como la mayoría de los programadores, me darías dos índices de matriz a cambio: uno que apunta al comienzo de la subcadena y otro apuntando al final.
Ambos enfoques son buenos, pero hay un concepto llamado corte que ofrece una solución ordenada en estas situaciones. Afortunadamente, no hay teoría arcana aquí; Cortar significa exactamente cómo parece: crear una fila/matriz más pequeña de una determinada, al igual que creamos piezas de fruta. Veamos a qué me refiero con un ejemplo simple:
Const Headline = "Y en el especial de esta noche, ¡el invitado que todos hemos estado esperando!"; const startIndex = headline. indexof ('invitado'); const endindex = headline. IndexOf ('Waiting'); const newheadline = headline. slice (startIndex, endIndex); console. log (newheadline);// invitado a todos hemos sido
Cuando cortamos (), le damos a JavaScript dos índices, uno en el que queremos que comience el corte, y otro donde queremos que se detenga. La captura con Slice () es que el índice final no está incluido en el resultado final, por lo que vemos que la palabra «espera» falta en el nuevo encabezado en el código anterior.
Conceptos como el corte son más prominentes en otros idiomas, especialmente Python. Si le preguntas a estos desarrolladores, te dirán que no pueden imaginar la vida sin esta funcionalidad, y con razón, ya que el lenguaje proporciona una sintaxis muy ordenada para cortar.
El corte es ordenado y extremadamente conveniente, y no hay razón para no usarlo. Tampoco es azúcar sintáctica imbuida de una penalización de rendimiento, ya que crea copias superficiales de la matriz/cadena original.¡Animo a los desarrolladores de JavaScript a familiarizarse con Slice () y agregarlo a su arsenal!
empalme ()
El método Splice () suena como un primo de Slice (), y de alguna manera podemos argumentar que lo es. Ambos crean nuevas matrices/filas de las originales, con una diferencia pequeña pero importante: Splice () elimina, cambia o agrega elementos, pero modifica la matriz original. Esta «destrucción» de la matriz original puede crear grandes problemas si no tiene cuidado o no comprende copias y referencias profundas. Me pregunto qué impidió que los desarrolladores usen el mismo enfoque que para Slice () y dejar la matriz de origen intacta, pero creo que podemos ser más indulgentes con el lenguaje creado en solo diez días.
A pesar de mis quejas, veamos cómo funciona Splice (). Mostraré un ejemplo en el que eliminemos algunos elementos de una matriz, ya que ese es el uso más común de este método. También me abstendré de ejemplos de adición e inserción porque son fáciles de encontrar y también simples.
const elementos = ['huevos', 'leche', 'queso', 'pan', 'mantequilla']; items. splice (2, 1); console. log (elementos);// ['huevos', 'leche', 'pan', 'mantequilla']
La llamada de empalme anterior () dice: Comience en el índice 2 (es decir, el tercer lugar) de la matriz y elimine un elemento. En esta matriz, ‘Cheese’ es el tercer elemento, por lo que se elimina de la matriz y la matriz de elementos se reduce como se esperaba. Por cierto, los elementos eliminados son devueltos por Splice () en la forma o matriz, por lo que podríamos entregar el «queso» a una variable si quisiéramos.
En mi experiencia, IndexOf () y Splice () funcionan bien juntos: encontramos el índice de un elemento y luego lo eliminamos de una matriz determinada. Sin embargo, tenga en cuenta que este no siempre es el método más eficiente, y a menudo utilizando claves de objetos (el equivalente de un mapa hash) es mucho más rápido.
cambio()
Shift () es un tipo de método de conveniencia que se utiliza para eliminar el primer elemento de una matriz. Tenga en cuenta que puede hacer lo mismo con Splice (), pero Shift () es un poco más fácil de recordar e intuitivo cuando todo lo que tiene que hacer es cortar el primer elemento.
const elementos = ['huevos', 'leche', 'queso', 'pan', 'mantequilla']; items. shift () console. log (elementos);// ['leche', 'queso', 'pan', 'mantequilla']
cancelar shift ()
Así como Shift () elimina el primer elemento de una matriz, Unshift () agrega un nuevo elemento al comienzo de la matriz. Su uso es igual de simple y compacto:
const elementos = ['huevos', 'leche']; elementos. unshift ('pan') console. log (elementos);// ['pan', 'huevos', 'leche']
Sin embargo, no puedo ayudarme y advirtiendo a los recién llegados al juego: a diferencia de los métodos populares push () y pop (), shift () y unshift () son extremadamente ineficientes (debido a la forma en que funcionan los algoritmos subyacentes). Por lo tanto, si está trabajando con matrices grandes (por ejemplo, más de 2000 elementos), demasiadas llamadas a estas funciones pueden hacer que su aplicación se detenga.
llenar().
A veces debe cambiar varios elementos a un solo valor o incluso «restablecer» toda la matriz, por así decirlo. En tales situaciones, llenar () lo guarda de bucles y errores que ocurren cuando va de uno a otro. Se puede usar para reemplazar la parte o la totalidad de una matriz con un valor dado. Veamos un par de ejemplos:
const Heights = [1, 2, 4, 5, 6, 7, 1, 1]; alturas. Completo (0); console. log (alturas);// [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] const Heights2 = [1, 2, 4, 5, 6, 7, 1, 1]; Heights2. Fill (0, 4); console. log (Heights2);// [1, 2, 4, 5, 0, 0, 0, 0, 0, 0]
Otras funciones que vale la pena mencionar
Si bien la lista anterior es lo que la mayoría de los desarrolladores de JavaScript encuentran y usan en sus carreras, de ninguna manera está completa. Hay tantas características (métodos) pequeñas pero útiles en JavaScript que sería imposible cubrirlas todas en un artículo. Sin embargo, algunos que vienen a la mente son los siguientes:
- retractarse()
- clasificar()
- registros()
- llenar().
- encontrar()
- departamento()
Te animo a que al menos los busques a través de ellos para tener una idea de que existen tales conveniencias.
JavaScript es un gran lenguaje, a pesar del pequeño número de conceptos centrales para aprender. Las muchas características (métodos) disponibles para nosotros representan una gran parte de este gran tamaño. Sin embargo, debido a que JavaScript es un lenguaje menor para la mayoría de los desarrolladores, no nos sumergimos lo suficientemente profundos, perdiendo las muchas características hermosas y útiles que ofrece. De hecho, lo mismo ocurre con los conceptos de programación funcional, ¡pero ese es un tema para otro día!😅
Siempre que pueda, pase algo de tiempo aprendiendo el idioma central (y, si es posible, bibliotecas de servicios bien conocidos como Lodash). Incluso unos pocos minutos dedicados a este esfuerzo darán como resultado un aumento significativo en la productividad, y el código será mucho más limpio y compacto.