He estado escribiendo mucho código ES6 para io.js recientemente. No hay mucho código en la naturaleza para aprender, así que siento que estoy definiendo mis propias convenciones a medida que avanzo.
Mi pregunta es acerca de cuándo utilizar const
vs let
.
He estado aplicando esta regla: si es posible, úsala const
. Úselo solo let
si sabe que su valor debe cambiar. (Siempre puede regresar y cambiar a const
a a let
si luego resulta que necesita cambiar su valor).
La razón principal de esta regla es que es fácil de aplicar de manera consistente. No hay zonas grises.
La cuestión es que, cuando aplico esta regla, en la práctica lo son el 95% de mis declaraciones const
. Y esto me parece raro. Solo lo uso let
para cosas como i
en un for
bucle, u ocasionalmente para cosas como los totales acumulados de Fibonacci (que no aparece mucho en la vida real). Me sorprendió esto: resulta que el 95% de las 'variables' en mi código ES5 hasta la fecha eran para valores que no varían. Pero ver const
todo mi código se siente mal de alguna manera.
Entonces mi pregunta es: ¿está bien usar const
tanto? ¿Realmente debería estar haciendo cosas como const foo = function () {...};
?
¿O debería reservar const
para ese tipo de situaciones en las que está codificando un literal en la parte superior de un módulo, como el que hace en mayúsculas const MARGIN_WIDTH = 410;
?
fuente
const
esto.function foo() {...}
es mejor que<anything> foo = function() {...}
function foo() {...}
puede causar una confusión menor al depurar, debido a la elevación. Además, su existencia significa que tenemos dos construcciones que hacen lo mismo, pero una de ellas solo funciona en un contexto muy específico. (Puede usar una expresión de función en cualquier lugar donde pueda existir una expresión, pero solo puede usar una declaración de función a nivel de enunciado). Si favorece la brevedad, el problema podría ser que la sintaxis de expresión de función use la palabra completafunction
.Respuestas:
Mi respuesta aquí no es específica de JavaScript.
Como regla general en cualquier idioma que me permita hacerlo de una manera semi fácil, diría que siempre use const / final / readonly / como se llame en su idioma siempre que sea posible. La razón es simple, es mucho más fácil razonar sobre el código cuando es obvio qué puede cambiar y qué no. Y además de esto, en muchos idiomas puede obtener soporte de herramientas que le indica que está haciendo algo mal cuando asigna de forma accidental a una variable que ha declarado como constante.
Volver atrás y cambiar una constante a una let es muy simple. Y seguir const por defecto te hace pensar dos veces antes de hacerlo. Y esto es en muchos casos algo bueno.
¿Cuántos errores has visto que implican que las variables cambien inesperadamente? Supongo que mucho. Sé que la mayoría de los errores que veo implican cambios de estado inesperados. No eliminarás todos estos errores usando liberalmente const, ¡pero eliminarás muchos de ellos!
Además, muchos lenguajes funcionales tienen variables inmutables donde todas las variables son constantes por defecto. Mira Erlang por ejemplo, o F #. La codificación sin asignación funciona perfectamente en estos lenguajes y es una de las muchas razones por las cuales las personas aman la programación funcional. Hay mucho que aprender de estos idiomas sobre la gestión del estado para convertirse en un mejor programador.
¡Y todo comienza con ser extremadamente liberal con const! ;) Son solo dos caracteres más para escribir en comparación con let, ¡así que adelante y
const
todas las cosas!fuente
const
son dos personajes más quelet
...val
en Scala (que declara una variable como inmutable) y solo al usovar
(el equivalente mutable) cuando no podemos usarloval
. En otras palabras, declaramos las variables como inmutables por defecto y solo introducimos la mutabilidad cuando la necesitamos absolutamente (lo cual puede ser simplemente porque el enfoque mutable es más limpio).Tenga cuidado, porque las
const
claves de objeto son mutables.Desde aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
considera este ejemplo:
Lo mismo para las matrices:
No me he decidido totalmente a mí mismo, pero estoy considerando usarlo
const
para todos los objetos que no sean matrices / no y usarloslet
para objetos / matrices.fuente
const
.colors = numbers
no funcionará, como se esperaba. Si desea proteger las propiedades de sus objetos, puede usarObject.freeze()
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…const moment = require('moment')
, a menos que seas el tipo de persona que está preocupada de que alguien intente hacerlomoment = dead.fish(() => pizza)
más tarde.moment = Date.now()
. Pero, en cualquier caso, si el código supone una invariante, no veo nada de malo en aplicarlo siempre que sea posible.No te preocupes por eso.
const
es una adición increíble a JavaScript, y recomendaría que lo use en todos los lugares que tenga sentido. Hace un código más robusto.Cuando se trata de objetos,
const
protegerá su variable de la reasignación, pero si necesita objetos inmutables, necesitará elObject.freeze
método, consulte a continuación.const
protegerá solo de la reasignación, y elfreeze
método protegerá todas las propiedades inmediatas. Si necesita que todas las propiedades anidadas también sean inmutables, deberá recurrirlas recursivamentefreeze
.fuente
Object.freeze
es poco profundo.En mi ES6
const
no se trata de la publicación de inmutabilidad , explico lo queconst
significa exactamente de acuerdo con las especificaciones.Basado en esos hechos objetivos, aquí está mi preferencia personal:
Por subjetivo que sea, es un hecho que esto coincide más estrechamente con la intención de la especificación.
Las personas que usan
let
por defecto generalmente tratan lasconst
variables como constantes (¡lo cual no es necesariamente, por diseño!). A cada uno lo suyo, pero prefiero usar las cosas para su propósito previsto, y no para un significado inventado que las personas le asignan en base a un malentendido.Usar
const
solo para constantes es como usar el<aside>
elemento HTML solo para el contenido de la barra lateral.fuente
const
si no es constante?const
es para lo que sirve. ¿Leíste lo anterior?const
Es que se llamaconst
. Es un nombre tonto (en javascript) que confunde a muchos (¿todos?) Desarrolladores al principio. OMI sería mejor siconst
hubiera sido llamadolet
(especialmente porquelet
es más corto peroconst
es mucho más común) y selet
llama otra cosa.Mi enfoque personal, pensado para ayudar a la legibilidad y comprensión del código:
let
es solo para variables de corta duración, definidas en una sola línea y no modificadas después. Generalmente aquellas variables que están ahí solo para disminuir la cantidad de tipeo. Por ejemplo:const
para todos los nombres que se sabe que son constantes en todo el módulo. No incluye valores locales constantes. Envalue
el ejemplo anterior, por ejemplo, es constante en su alcance y podría declararse conconst
, pero dado que hay muchas iteraciones y para cada una hay un valor con el mismo nombre , "valor", que podría engañar al lector paravalue
que siempre piense lo mismo. Los módulos y funciones son el mejor ejemplo deconst
variables:var
para todo lo que puede o no ser variable. Los nombres que pueden confundir a las personas que leen el código, incluso si son constantes localmente y no son adecuadoslet
(es decir, no se completan en una declaración directa simple), se solicitan para ser declarados convar
. Por ejemplo:Comentarios adicionales y posibles actualizaciones futuras aquí .
fuente
JavaScript es un poco especial en el sentido de que las variables pueden ser funciones y demás, pero tenga en cuenta en C #, Java u otro lenguaje de estilo C similar:
El
const
es impar, y eso se debe a declaraciones de métodos en estos idiomas no pueden cambiar, una vez que se compilan en otra cosa, eso es lo que hacen, no importa lo que (ignorando algunos hacks horribles que puedan existir).¿Por qué debería ser JavaScript diferente? Por lo tanto, no se compila, pero eso no significa que debamos descartar la seguridad que los compiladores pueden proporcionar. El uso de la
const
palabra clave nos brinda más seguridad, lo que seguramente conducirá a aplicaciones más robustas.fuente