He estado aprendiendo JavaScript estos días. Me sorprende el gran potencial de este lenguaje. ¿Por qué la gente se queja tanto? ¿Es tan difícil de depurar como dice la gente? ¿Qué utilizas para depurar JavaScript?

Escribiría mis rencores personales sobre el Javascript. ES6 arregló muchas cosas, por lo que este lenguaje es al menos soportable para mí ahora.

Debo decir que probablemente piense que este lenguaje tiene un “gran potencial” porque tiene funciones de primera clase, alta disponibilidad (¡cualquier navegador!), Un gran seguimiento celoso y algunas bibliotecas frontales que le permiten escribir impresionantes demostraciones visuales. Este es probablemente el único punto positivo de esta plataforma de tiempo de ejecución.

Primero , no hay forma de escribir nada. Por diseño. Javascript es un lenguaje con escritura 100% dinámica. Esto realmente obstaculiza seriamente su capacidad de escribir código autodocumentado, porque cuando lee la definición de alguna función, no tiene idea de cuáles son sus argumentos, qué puede hacer con ellos aparte de lo que hace actualmente esta función.

En segundo lugar , su sistema de tipos también es realmente débil. Es tan débil y las reglas de conversión implícitas son tan intrincadas que puedes obtener errores muy oscuros de la nada. Este es un problema tan malo en Javascript que es fuente de bromas en la industria. Hay varios videos de WTF que lo explican en detalle. Y si desea combatir este problema con el uso de `===` comparación estricta en todos los lugares donde necesita verificar la igualdad, se está metiendo en un primer problema: es realmente muy difícil deducir los tipos de objetos leyendo el código , y Javascript no proporciona ninguna ayuda. Su comparación estricta puede ser perjudicial en lugar de útil, porque, por ejemplo, si compara la cadena de la entrada del usuario con el número codificado, siempre obtendrá “falso”. Su lógica es correcta, pero su gestión de tipos no lo es. Incluso si está dentro de un tiempo de ejecución tipado dinámico débil.

Tercero , este es el único idioma que conozco que no incluye ningún sistema de módulos, es decir, llamar a un archivo de código fuente desde otro archivo de código fuente. Por diseño. Porque el código Javascript está siendo invocado por los fragmentos “ en el navegador. Por lo tanto, su código HTML se convierte en su sistema de módulos, lo cual es completamente absurdo y difícil de realizar en aplicaciones grandes y serias. ES6 introdujo el concepto de módulos (finalmente), pero aún no puede tenerlo dentro de los navegadores, al menos por ahora, porque los módulos ES6 se importan estáticamente, lo que significa que primero el navegador debe descargar todos sus archivos de código fuente, luego realizar el importaciones, y solo entonces lo ejecutará. La solución actual es agrupar todos los módulos en un solo archivo Javascript que se llama desde la página HTML, pero conduce a problemas de código innecesarios en algunas páginas, lo que lleva a otra solución ad hoc. Además, tenemos módulos de estilo NPM, que se importan dinámicamente, en tiempo de ejecución, y como resultado son totalmente incompatibles con los módulos ES6. En resumen, esto es un desastre, y es completamente inaceptable en el lenguaje de nivel de producción.

Cuarto , configurar una cadena de herramientas para el desarrollo moderno de Javascript fullstack es un infierno. Es una pesadilla. Ni siquiera explicaré por qué. Simplemente intente instalar y configurar las siguientes piezas de tecnología desde la carpeta vacía a la página de trabajo index.html en el navegador:

  1. Node.js
  2. NPM
  3. Express.js para el código de back-end
  4. Ruta del índice Barebones para Express.
  5. Babel para ES6
  6. Webpack + recarga de módulo caliente
  7. Sus bibliotecas favoritas para el desarrollo frontend. Quizás tengas suerte si pruebas con vainilla. Excepto que no: el barebones Javascript no contiene nada necesario para un desarrollo web serio, de todos modos terminará con algunas dependencias.

Quinta . ES6 solucionó todo esto, pero la sintaxis fue irritante inicialmente. La variable `this` cambia su valor dependiendo de dónde se llamó su función. Palabra clave `function` en todas partes. No hay otras abstracciones en el Javascript, y la palabra clave más utilizada es de 8 letras de largo. Es doloroso escribir. La estúpida palabra clave `var` siempre es necesaria pero nunca obligatoria, por lo que no hay forma de imponer su presencia.

Sexto . No precisa aritmética de enteros. Todos los números son “dobles”. WHAAA ?!

Siete . La API de fecha / hora incorporada es horrible. No es intuitivo, tiene sorpresas desagradables (por ejemplo, la salida de la llamada `getMonth ()` o las marcas de tiempo son milisegundos desde el comienzo de la época de Unix), es simplemente difícil de usar. Incluso la clase PHP DateTime recorre círculos alrededor de la API de fecha / hora de Javascript, y PHP es probablemente el lenguaje más odiado y despreciado.

Ocho. Por diseño, dados los puntos 1 y 2, nunca obtendremos la autocompletación adecuada e “Ir a la definición” para Javascript. Buena suerte navegando más de 100 bases de código KLOC sin él.

Noveno . En cuanto a la depuración, no, no es difícil de depurar. Incluso me gusta la consola Javascript y las maravillas de `console.log`, que es capaz de imprimir de manera bonita cualquier tipo de objeto que arroje dentro de la consola. Los navegadores modernos incluyen el depurador de Javascript de forma predeterminada, y solo puede establecer un punto de interrupción en cualquier línea de código que desee y activarlo mediante un toque inteligente con la interfaz de usuario. El problema es que en 2017 las bases de código Javascript generalmente se compilan a partir de archivos de código fuente separados en un blob minible ilegible, que es completamente inútil para depurar. Esta es una razón por la que no puede simplemente abrir su sitio de producción, establecer un punto de interrupción y depurar algo en vivo. Debe tener una copia local o un servidor de prueba configurado sin minificación.

Décimo . Todo Javascript en la página se ejecuta en el mismo hilo de ejecución. ¿Se incluye un error de sintaxis en un archivo de código fuente Javascript separado para rastrear el comportamiento de los usuarios? Aquí está su IU destruida o pantalla blanca si su sitio web es una aplicación de una sola página.

En conclusión, personalmente no me gusta por completo el Javascript por su biblioteca estándar miserable que me obliga a depender de un código de terceros altamente volátil para todo. Su semántica es severamente limitante porque la única abstracción que tienes es la función, y con ES6 tenemos una sintaxis concisa que resuelve algunos problemas pero es realmente difícil de leer. Todavía no tenemos un sistema de módulos que funcione de forma nativa en los navegadores, y probablemente nunca lo hará. La cadena de herramientas, aunque impresionante, es muy difícil de configurar y configurar.

Este entorno de lenguaje es simplemente doloroso de usar después de cualquier otro lenguaje de producción. Mira lo que puedes hacer con bases de código Java puras en algunos IDE decentes como IntelliJ IDEA. Su conjunto de características se parece al juguete de un niño después de monstruos como C ++ 14 (ni siquiera mencionaré 17) o Haskell. Su mejor apuesta en la gestión de dependencias es agrupar todo, o puede obtener compilaciones rotas de la nada en cualquier momento.

Lo único que me hace tocarlo es porque Javascript ha ganado el concurso de popularidad y es el único idioma utilizado en los navegadores web, por lo que no hay otra opción y no hay forma de evitarlo.

JavaScript es un lenguaje de programación potente y multi-paradigmático, que tiene una barrera de entrada relativamente baja. Tiene su parte de verrugas (como algunas reglas de conversión implícitas pobres, que a menudo se usan para azotarlo, pero en realidad no causan muchos problemas). Pero ningún lenguaje de programación de uso común es sin verrugas. También tenía algunas deficiencias notables, pero las principales se están abordando (falta de un sistema de módulos, y estático ‘esto’).

Entonces, ¿por qué la gente odia en JavaScript? Puedo pensar en tres razones principales:

  1. Falta de elección: los desarrolladores a menudo son ferozmente independientes y odian cuando no se les da la posibilidad de tomar sus propias decisiones técnicas. Como resultado, muchos desarrolladores están descontentos por el hecho de que JavaScript es el único lenguaje de programación totalmente compatible con los navegadores.
  2. Falta de comprensión: JavaScript es confuso porque parece Java, o incluso C ++, pero realmente no lo es. Por ejemplo, los prototipos parecen realmente extraños para un desarrollador acostumbrado a las clases.
  3. El DOM: la API proporcionada por los navegadores es potente, pero también puede ser difícil de usar correctamente. Muchos desarrolladores no distinguen entre esta API y el código JavaScript que se utiliza para manipularla.

Para la depuración, siempre puede utilizar las herramientas F12 de su navegador o la muy confiable declaración Console.log (). Sin embargo, dado que Java Script no es un lenguaje muy fuertemente tipado, los mensajes de error lanzados a veces son muy vagos para comprender realmente la línea o el punto real en el programa que causa el error. Si su proyecto lo permite, siempre puede utilizar TypeScript: JavaScript que escala TypeScript es un superconjunto de JavaScript que proporciona principalmente tipos estáticos opcionales, clases e interfaces. Uno de los grandes beneficios es permitir que los IDE brinden un entorno más rico para detectar errores comunes a medida que escribe el código .

Para obtener más información sobre TypeScript, consulte: ¿Qué es TypeScript y por qué lo usaría en lugar de JavaScript? recurso en desbordamiento de pila

Aquí hay una gran respuesta de por qué JavaScript es un montón de hedor.

Aquí hay una ironía: un defensor de JS tiene un video WTF de JavaScript. Muestra:

1 <2 <3; // cierto

3> 2> 1; // falso

42. a Fijo (2); // Error de sintaxis
42. toFixed (2); // Error de sintaxis
42. A Fijo (2); // “42.00”
42) toFixed (2); // “42.00”
42.0.toFixed (2); // “42.00”

[] ==! []; // cierto

Javascript es tan malo que hay varios transpiladores que te permitirán escribir código usando las mejores prácticas en un lenguaje diferente (TypeScript es uno de los mejores IMO) que se transcodifica en JavaScript vainilla. Si el lenguaje JavaScript por sí solo fuera decente, no necesitaríamos transpiladores.

Los marcos como Angular, React, Ember, Vue y otros han disminuido los muchos puntos débiles de JavaScript.

En cuanto a la depuración de JS, solía ser casi imposible. Firefox y Chrome tienen excelentes herramientas de depuración. Simplemente ponga `debugger;` en su código JS, abra la herramienta del desarrollador en Chrome o FF y le permitirá recorrer el código.

Los marcos ayudan mucho pero tiene un costo (complejidad). Entonces, si está utilizando un marco y está en una pila de código de seguimiento de depuración que se sumerge en el código interno del marco, es mejor que cierre el navegador web y comience nuevamente debido a la complejidad.

Hoy es mucho mejor de lo que alguna vez fue. Una parte decente de las quejas proviene de la forma en que solía ser: odiar a JS es una tradición.

También es más problemático cuanto más grande es un proyecto, por lo que si solo estás aprendiendo es más difícil ver los problemas.

Y también es uno de los idiomas más utilizados, ya que se ve forzado a los desarrolladores al estar incrustado en la web. Con idiomas más pequeños, la mayoría de las personas que lo usan lo usan por elección, y es más probable que realmente les guste. Grandes lenguajes populares, muchas personas a las que no necesariamente les gustan todavía los usan, por lo que obtienes muchos quejidos, desproporcionados a la garbagosidad real del idioma.

Ver la respuesta de Richard Kenneth Eng a ¿Node.js está sobrevalorado?

Vea la respuesta de Richard Kenneth Eng a Dada la complejidad de los frameworks y los lenguajes, ¿está la red diseñada en exceso?

Y la respuesta de Richard Kenneth Eng a ¿Cuál es, en su opinión, el lenguaje de programación más difícil de dominar o sobresalir, y por qué?

Y la respuesta de Peter DiSalvo a ¿Por qué JavaScript es tan odiado?