"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Conceptos de JavaScript que todo desarrollador de Node debe dominar

Conceptos de JavaScript que todo desarrollador de Node debe dominar

Publicado el 2024-11-02
Navegar:523

Node.js se ha convertido rápidamente en un estándar para crear aplicaciones web y software de sistemas, gracias a su capacidad para aprovechar JavaScript en el back-end. Marcos populares como Express y herramientas como Webpack contribuyen a su uso generalizado. Aunque existen competidores como Deno y Bun, Node sigue siendo la plataforma JavaScript líder del lado del servidor.

La naturaleza multiparadigma de JavaScript permite varios estilos de programación, pero también plantea riesgos como el alcance y la mutación de objetos. La falta de optimización de llamadas de cola hace que las grandes iteraciones recursivas sean peligrosas, y la arquitectura de subproceso único de Node requiere código asincrónico para lograr eficiencia. A pesar de sus desafíos, seguir conceptos clave y mejores prácticas en JavaScript puede ayudar a los desarrolladores de Node.js a escribir código escalable y eficiente.

1. Cierres de JavaScript

Un cierre en JavaScript es una función interna que tiene acceso al alcance de su función externa, incluso después de que la función externa haya devuelto el control. Un cierre hace que las variables de la función interna sean privadas. La programación funcional ha ganado popularidad, lo que hace que los cierres sean una parte esencial del kit del desarrollador de Node. Aquí hay un ejemplo simple de un cierre en JavaScript:

JavaScript concepts every Node developer must master

  • A la variable recuento se le asigna una función externa. La función externa se ejecuta solo una vez, lo que pone el contador en cero y devuelve una función interna. Solo la función interna puede acceder a la variable _counter, lo que hace que se comporte como una variable privada.
  • El ejemplo aquí es una función de orden superior (o metafunción, una función que toma o devuelve otra función). Los cierres se encuentran en muchas otras aplicaciones. Un cierre ocurre cada vez que define una función dentro de otra función y la función interna obtiene su propio alcance y acceso al alcance principal; es decir, la función interna puede "ver" las variables externas, pero no al revés.
  • Esto también resulta útil con métodos funcionales como map(innerFunction), donde innerFunction puede hacer uso de variables definidas en el alcance externo.

2. Prototipos de JavaScript

Cada función de JavaScript tiene una propiedad prototipo que se utiliza para adjuntar propiedades y métodos. Esta propiedad no es enumerable. Permite al desarrollador adjuntar métodos o funciones miembro a sus objetos. JavaScript admite la herencia solo a través de la propiedad prototipo. En el caso de un objeto heredado, la propiedad del prototipo apunta al padre del objeto. Un enfoque común para adjuntar métodos a una función es usar prototipos como se muestra aquí:

JavaScript concepts every Node developer must master

Aunque el JavaScript moderno tiene soporte de clases bastante sofisticado, todavía utiliza el sistema prototipo bajo el capó. Esta es la fuente de gran parte de la flexibilidad del lenguaje.

3. Definir propiedades privadas usando nombres hash

En la antigüedad, se usaba la convención de anteponer variables con un guión bajo para indicar que se suponía que una variable era privada. Sin embargo, esto fue sólo una sugerencia y no una restricción impuesta por la plataforma. JavaScript moderno ofrece miembros y métodos privados de hashtag para clases:

JavaScript concepts every Node developer must master

¡Los nombres hash privados son una característica nueva y muy bienvenida en JavaScript! Las versiones recientes de Node y los navegadores lo admiten, y las herramientas de desarrollo de Chrome le permiten acceder directamente a variables privadas para su comodidad.

4. Definición de propiedades privadas mediante cierres

Otro enfoque que a veces verás para solucionar la falta de propiedades privadas en el sistema prototipo de JavaScript es utilizar un cierre. El JavaScript moderno le permite definir propiedades privadas utilizando el prefijo hashtag, como se muestra en el ejemplo anterior. Sin embargo, esto no funciona para el sistema prototipo de JavaScript. Además, este es un truco que encontrarás a menudo en el código y es importante comprender lo que está haciendo.

Definir propiedades privadas mediante cierres le permite simular una variable privada. Las funciones miembro que necesitan acceso a propiedades privadas deben definirse en el propio objeto. Aquí está la sintaxis para crear propiedades privadas usando cierres:

JavaScript concepts every Node developer must master

5. Módulos de JavaScript

Érase una vez, JavaScript no tenía un sistema de módulos, y los desarrolladores idearon un truco inteligente (llamado patrón de módulo) para montar algo que funcionara. A medida que JavaScript evolucionó, generó no uno sino dos sistemas de módulos: la sintaxis CommonJS include y la sintaxis ES6 require.

Node ha utilizado tradicionalmente CommonJS, mientras que los navegadores utilizan ES6. Sin embargo, las versiones recientes de Node (en los últimos años) también son compatibles con ES6. La tendencia ahora es usar módulos ES6 y algún día tendremos solo una sintaxis de módulo para usar en JavaScript. ES6 se ve así (donde exportamos un módulo predeterminado y luego lo importamos):

JavaScript concepts every Node developer must master

Aún verás CommonJS y, en ocasiones, necesitarás usarlo para importar un módulo. Así es como se ve exportar y luego importar un módulo predeterminado usando CommonJS:

JavaScript concepts every Node developer must master

6. Manejo de errores

No importa en qué idioma o entorno se encuentre, el manejo de errores es esencial e inevitable. Nodo no es una excepción. Hay tres formas básicas de abordar los errores: intentar/capturar bloques, generar nuevos errores y controladores on().

Los bloques con try/catch son el medio probado y verdadero para capturar errores cuando algo sale mal:

JavaScript concepts every Node developer must master

En este caso, registramos el error en la consola con console.error. Puede optar por generar el error y pasarlo al siguiente controlador. Tenga en cuenta que esto interrumpe la ejecución del flujo de código; es decir, la ejecución actual se detiene y el siguiente controlador de errores de la pila se hace cargo:

JavaScript concepts every Node developer must master

El JavaScript moderno ofrece bastantes propiedades útiles en sus objetos Error, incluido Error.stack para echar un vistazo al seguimiento de la pila. En el ejemplo anterior, estamos configurando la propiedad Error.message y Error.cause con los argumentos del constructor.

Otro lugar donde encontrará errores es en bloques de código asincrónico donde maneja resultados normales con .then(). En este caso, puede utilizar un controlador on('error') o un evento onerror, dependiendo de cómo la promesa devuelva los errores. A veces, la API le devolverá un objeto de error como segundo valor de retorno con el valor normal. (Si usa await en la llamada asíncrona, puede incluirla en un try/catch para manejar cualquier error). Aquí hay un ejemplo simple de manejo de un error asincrónico:

JavaScript concepts every Node developer must master

Pase lo que pase, ¡nunca te tragues los errores! No lo mostraré aquí porque alguien podría copiarlo y pegarlo. Básicamente, si detecta un error y luego no hace nada, su programa continuará funcionando silenciosamente sin ninguna indicación obvia de que algo salió mal. La lógica se romperá y tendrás que reflexionar hasta que encuentres el bloque de captura sin nada dentro. (Tenga en cuenta que proporcionar un bloque finally{} sin un bloque catch hará que se traguen sus errores).

7. Curry de JavaScript

El curry es un método para hacer que las funciones sean más flexibles. Con una función curry, puede pasar todos los argumentos que la función espera y obtener el resultado, o puede pasar solo un subconjunto de argumentos y recibir una función que espera el resto de los argumentos. A continuación se muestra un ejemplo sencillo de curry:

JavaScript concepts every Node developer must master

La función curry original se puede llamar directamente pasando cada uno de los parámetros en un conjunto separado de paréntesis, uno tras otro:

JavaScript concepts every Node developer must master

Esta es una técnica interesante que te permite crear fábricas de funciones, donde las funciones externas te permiten configurar parcialmente la interna. Por ejemplo, también puedes usar la función de curry anterior así:

JavaScript concepts every Node developer must master

En el uso en el mundo real, esta idea puede ser de ayuda cuando necesitas crear muchas funciones que varían según ciertos parámetros.

8. Métodos de aplicación, llamada y vinculación de JavaScript

Aunque no los usamos todos los días, es bueno entender qué son los métodos call, apply y bind. Aquí estamos ante una gran flexibilidad lingüística. En esencia, estos métodos le permiten especificar a qué se resuelve la palabra clave esta.

En las tres funciones, el primer argumento es siempre el este valor o contexto que desea darle a la función.

De los tres, llamar es el más fácil. Es lo mismo que invocar una función mientras se especifica su contexto. Aquí tienes un ejemplo:

JavaScript concepts every Node developer must master

Tenga en cuenta que aplicar es casi lo mismo que llamar. La única diferencia es que pasas los argumentos como una matriz y no por separado. Las matrices son más fáciles de manipular en JavaScript, lo que abre una mayor cantidad de posibilidades para trabajar con funciones. Aquí hay un ejemplo usando aplicar y llamar:

JavaScript concepts every Node developer must master

El método bind le permite pasar argumentos a una función sin invocarla. Se devuelve una nueva función con argumentos acotados que preceden a cualquier argumento adicional. Aquí tienes un ejemplo:

JavaScript concepts every Node developer must master

9. Memorización de JavaScript

La memorización es una técnica de optimización que acelera la ejecución de funciones al almacenar los resultados de operaciones costosas y devolver los resultados almacenados en caché cuando el mismo conjunto de entradas vuelve a ocurrir. Los objetos de JavaScript se comportan como matrices asociativas, lo que facilita la implementación de la memorización en JavaScript. A continuación se explica cómo convertir una función factorial recursiva en una función factorial memorizada:

JavaScript concepts every Node developer must master

10. JavaScript IIFE

Una expresión de función invocada inmediatamente (IIFE) es una función que se ejecuta tan pronto como se crea. No tiene conexión con ningún evento ni ejecución asincrónica. Puede definir un IIFE como se muestra aquí:

JavaScript concepts every Node developer must master

El primer par de paréntesis function(){...} convierte el código dentro del paréntesis en una expresión. El segundo par de paréntesis llama a la función resultante de la expresión. Un IIFE también puede describirse como una función anónima que se invoca a sí misma. Su uso más común es limitar el alcance de una variable creada mediante var o encapsular el contexto para evitar colisiones de nombres.

También hay situaciones en las que necesitas llamar a una función usando await, pero no estás dentro de un bloque de funciones asíncronas. Esto sucede a veces en archivos que desea que sean ejecutables directamente y también importados como un módulo. Puede envolver una llamada de función de este tipo en un bloque IIFE así:

JavaScript concepts every Node developer must master

11. Funciones de argumento útiles

Aunque JavaScript no admite la sobrecarga de métodos (porque puede manejar recuentos de argumentos arbitrarios en funciones), tiene varias funciones poderosas para manejar argumentos. Por un lado, puede definir una función o método con valores predeterminados:

JavaScript concepts every Node developer must master

También puede aceptar y manejar todos los argumentos a la vez, de modo que pueda manejar cualquier número de argumentos pasados. Esto utiliza el operador rest para recopilar todos los argumentos en una matriz:

JavaScript concepts every Node developer must master

Si realmente necesitas lidiar con diferentes configuraciones de argumentos, siempre puedes verificarlas:

JavaScript concepts every Node developer must master

Además, recuerde que JavaScript incluye una matriz de argumentos incorporada. Cada función o método le proporciona automáticamente la variable argumentos, que contiene todos los argumentos pasados ​​a la llamada.

Conclusión

A medida que te familiarices con Node, notarás que hay muchas formas de resolver casi todos los problemas. El enfoque correcto no siempre es obvio. A veces, existen varios enfoques válidos para una situación determinada. Conocer las muchas opciones disponibles ayuda.

Los 10 conceptos de JavaScript que se analizan aquí son conceptos básicos que todo desarrollador de Node se beneficiará de conocer. Pero son la punta del iceberg. JavaScript es un lenguaje potente y complejo. Cuanto más lo uses, más entenderás cuán vasto es realmente JavaScript y cuánto puedes hacer con él.

Declaración de liberación Este artículo se reproduce en: https://dev.to/usman_awan/10-javascript-concepts-every-node-developer-must-master-2na?1 Si hay alguna infracción, comuníquese con [email protected] para eliminar él
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3