La semántica de var
ylet
var
y let
son una declaración para la máquina y para otros programadores:
Tengo la intención de que el valor de esta asignación cambie en el transcurso de la ejecución. No confíe en el valor eventual de esta asignación.
Implicaciones de usar var
ylet
var
y let
obligar a otros programadores a leer todo el código intermedio desde la declaración hasta el uso final, y razonar sobre el valor de la asignación en ese punto de la ejecución del programa.
Debilitan el razonamiento de la máquina para que ESLint y otros servicios de idiomas detecten correctamente los nombres de variables mal escritas en asignaciones posteriores y la reutilización del alcance de los nombres de variables de alcance externo donde el alcance interno olvida declarar.
También hacen que los tiempos de ejecución ejecuten muchas iteraciones en todas las rutas de código para detectar que en realidad son, de hecho, constantes, antes de poder optimizarlas. Aunque esto es menos problemático que la detección de errores y la comprensión del desarrollador.
Cuándo usar const
Si el valor de la referencia no cambia en el transcurso de la ejecución, la sintaxis correcta para expresar la intención del programador es const
. Para los objetos, cambiar el valor de la referencia significa apuntar a otro objeto, ya que la referencia es inmutable, pero el objeto no.
" const
" objetos
Para referencias de objeto, el puntero no se puede cambiar a otro objeto, pero el objeto que se crea y se asigna a una const
declaración es mutable. Puede agregar o eliminar elementos de una const
matriz a la que se hace referencia y mutar claves de propiedad en un const
objeto referenciado.
Para lograr objetos inmutables (que de nuevo, hacen que su código sea más fácil de razonar para humanos y máquinas), puede hacer Object.freeze
el objeto en la declaración / asignación / creación, de esta manera:
const Options = Object.freeze(['YES', 'NO'])
Object.freeze tiene un impacto en el rendimiento, pero su código probablemente sea lento por otras razones. Quieres perfilarlo.
También puede encapsular el objeto mutable en una máquina de estado y devolver copias profundas como valores (así es como funcionan los estados de Redux y React). Consulte Evitar el estado global mutable en Browser JS para ver un ejemplo de cómo construir esto desde los primeros principios.
Cuando var
y let
son un buen partido
let
y var
representan estado mutable. En mi opinión, solo deberían usarse para modelar el estado mutable real . Cosas como "¿ está viva la conexión? ".
Estos se encapsulan mejor en máquinas de estado comprobables que exponen valores constantes que representan " el estado actual de la conexión ", que es una constante en cualquier momento, y en lo que está realmente interesado el resto del código.
La programación ya es bastante difícil con la composición de efectos secundarios y la transformación de datos. Convertir cada función en una máquina de estado no comprobable creando un estado mutable con variables que solo acumulan la complejidad.
Para una explicación más matizada, vea Shun the Mutant - The case forconst
.