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 constvs let.
He estado aplicando esta regla: si es posible, úsala const. Úselo solo letsi sabe que su valor debe cambiar. (Siempre puede regresar y cambiar a consta a letsi 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 letpara cosas como ien un forbucle, 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 consttodo mi código se siente mal de alguna manera.
Entonces mi pregunta es: ¿está bien usar consttanto? ¿Realmente debería estar haciendo cosas como const foo = function () {...};?
¿O debería reservar constpara 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

constesto.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
consttodas las cosas!fuente
constson dos personajes más quelet...valen 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
constclaves 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
constpara todos los objetos que no sean matrices / no y usarlosletpara objetos / matrices.fuente
const.colors = numbersno 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.
constes 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,
constprotegerá su variable de la reasignación, pero si necesita objetos inmutables, necesitará elObject.freezemétodo, consulte a continuación.constprotegerá solo de la reasignación, y elfreezemétodo protegerá todas las propiedades inmediatas. Si necesita que todas las propiedades anidadas también sean inmutables, deberá recurrirlas recursivamentefreeze.fuente
Object.freezees poco profundo.En mi ES6
constno se trata de la publicación de inmutabilidad , explico lo queconstsignifica 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
letpor defecto generalmente tratan lasconstvariables 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
constsolo para constantes es como usar el<aside>elemento HTML solo para el contenido de la barra lateral.fuente
constsi no es constante?constes para lo que sirve. ¿Leíste lo anterior?constEs que se llamaconst. Es un nombre tonto (en javascript) que confunde a muchos (¿todos?) Desarrolladores al principio. OMI sería mejor siconsthubiera sido llamadolet(especialmente porqueletes más corto peroconstes mucho más común) y seletllama otra cosa.Mi enfoque personal, pensado para ayudar a la legibilidad y comprensión del código:
letes 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:constpara todos los nombres que se sabe que son constantes en todo el módulo. No incluye valores locales constantes. Envalueel 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 paravalueque siempre piense lo mismo. Los módulos y funciones son el mejor ejemplo deconstvariables:varpara 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
constes 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
constpalabra clave nos brinda más seguridad, lo que seguramente conducirá a aplicaciones más robustas.fuente