Todo sobre variables
Una variable es un almacén con un nombre para guardar datos.
Variables y constantes
Una variable es un “almacén con un nombre” para guardar datos. Podemos usar variables para almacenar golosinas, personas, y otros datos.
📝
Definición
En programación, una variable está formada por un espacio en el sistema de almacenaje (memoria principal de un ordenador) y un nombre simbólico (un identificador) que está asociado a dicho espacio.
Para generar una variable se usan una de las siguientes palabras clave: let
, const
y var
.
📝
Palabras clave
Las palabras clave (o keywords) en un lenguaje de programación son términos reservados que tienen un significado especial para el compilador o intérprete. No pueden ser utilizados como nombres de variables, funciones u otros identificadores en el código, ya que están predefinidas para realizar tareas específicas dentro del lenguaje.
Declarar variables
JavaScript distingue entre mayúsculas y minúsculas (es case-sensitive) y utiliza el conjunto de caracteres Unicode. Por ejemplo, la palabra «Perro» se podría usar como el nombre de una variable.
Pero, la variable perro
no es la misma que Perro
porque JavaScript distingue entre mayúsculas y minúsculas.
En JavaScript, las instrucciones se denominan declaraciones y están separadas por punto y coma (;
).
No es necesario un punto y coma después de una declaración si está escrita en su propia línea. Pero si se desea más de una declaración en una línea, entonces debes separarlas con punto y coma.
📝
Nota
ECMAScript también tiene reglas para la inserción automática del punto y coma —IAPC
— (ASI en inglés, por sus siglas «Automatic Semicolon Insertion») al final de las declaraciones. (Para obtener más información, consulta la referencia detallada sobre la gramática léxica
de JavaScript).
Sin embargo, se considera una buena práctica escribir siempre un punto y coma después de una declaración, incluso cuando no sea estrictamente necesario. Esta práctica reduce las posibilidades de que se introduzcan errores en el código.
El texto fuente del script JavaScript se escanea de izquierda a derecha y se convierte en una secuencia de elementos de entrada que son fragmentos, caracteres de control, terminadores de línea, comentarios o espacios en blanco. (Los espacios, tabulaciones y caracteres de nueva línea se consideran espacios en blanco).
Puedes declarar una variable de dos formas
- Con la palabra clave
var
. Por ejemplo,var x = 42
. Esta sintaxis se puede utilizar para declarar variables locales y globales, dependiendo del contexto de ejecución. - Con la palabra clave
const
olet
. Por ejemplo,let y = 13
. Esta sintaxis se puede utilizar para declarar una variable local con ámbito de bloque.
También puedes simplemente asignar un valor a una variable. Por ejemplo, x = 42
. Esta forma crea una variable global no declarada. También genera una advertencia estricta de JavaScript. Las variables globales no declaradas a menudo pueden provocar un comportamiento inesperado. Por lo tanto, se desaconseja utilizar variables globales no declaradas.
Una analogía de la vida real
Podemos comprender fácilmente el concepto de una “variable” si nos la imaginamos como una “caja” con una etiqueta de nombre único pegada en ella.
Por ejemplo, podemos imaginar la variable message
como una caja etiquetada "message"
con el valor "Hola!"
adentro:
Podemos introducir cualquier valor a la caja.
También la podemos cambiar cuantas veces queramos:
Cuando el valor ha sido alterado, los datos antiguos serán removidos de la variable:
También podemos declarar dos variables y copiar datos de una a la otra.
📝
Declarar dos veces lanza un error
Una variable debe ser declarada solamente una vez.
Una declaración repetida de la misma variable es un error:
Debemos declarar una variable una sola vez y desde entonces referirnos a ella sin let
.
📝
Lenguajes funcionales
Es interesante notar el hecho que lenguajes de programación funcional, como Scala o Erlang prohíben cambiar el valor de las variables.
En tales lenguajes, una vez la variable ha sido almacenada “en la caja”, permanece allí por siempre. Si necesitamos almacenar algo más, el lenguaje nos obliga a crear una nueva caja (generar una nueva variable). No podemos reusar la antigua.
Aunque puede parecer un poco extraño a primera vista, estos lenguajes son muy capaces de desarrollo serio. Más aún, existen áreas como computación en paralelo en las cuales esta limitación otorga ciertos beneficios. Estudiar tales lenguajes (incluso sin la intención de usarlo en el futuro cercano) es recomendable para ampliar la mente.
Nombramiento de variables
Existen dos limitaciones de nombre de variables en JavaScript:
- El nombre únicamente puede incluir letras, dígitos, o los símbolos
$
y_
. - El primer carácter no puede ser un dígito.
Ejemplos de nombres válidos:
Cuando el nombre contiene varias palabras, comúnmente se utiliza camelCase. Es decir: palabras van una detrás de otra, con cada palabra iniciando con letra mayúscula: miNombreMuyLargo
.
Es interesante notar que el símbolo del dólar '$'
y el guion bajo '_'
también se utilizan en nombres. Son símbolos comunes, tal como las letras, sin ningún significado especial.
Los siguientes nombres son válidos:
Ejemplos de nombres incorrectos:
✅
La Capitalización es Importante
Dos variables con nombres manzana
y MANZANA
son variables distintas.
✅
Las letras que no son del alfabeto inglés están permitidas, pero no se recomiendan
Es posible utilizar letras de cualquier alfabeto, incluyendo letras del cirílico, logogramas chinos, etc.:
Técnicamente, no existe ningún error aquí. Tales nombres están permitidos, pero existe una tradición internacional de utilizar inglés en el nombramiento de variables. Incluso si estamos escribiendo un script pequeño, este puede tener una larga vida por delante. Puede ser necesario que gente de otros países deba leerlo en algún momento.
✅
Nombres reservados
Hay una lista de palabras reservadas, las cuales no pueden ser utilizadas como nombre de variable porque el lenguaje en sí las utiliza.
Por ejemplo: let
, class
, return
, y function
están reservadas.
El siguiente código nos da un error de sintaxis:
✅
Una asignación sin utilizar `use strict`
Normalmente, debemos definir una variable antes de utilizarla. Pero, en los viejos tiempos, era técnicamente posible crear una variable simplemente asignando un valor sin utilizar ‘let’. Esto aún funciona si no ponemos ‘use strict’ en nuestros scripts para mantener la compatibilidad con scripts antiguos.
Esto es una mala práctica que causaría errores en ‘strict mode’:
Nombrar cosas correctamente
Estando en el tema de las variables, existe una cosa de mucha importancia.
Una variable debe tener un nombre claro, de significado evidente, que describa el dato que almacena.
Nombrar variables es una de las habilidades más importantes y complejas en la programación. Un vistazo rápido a el nombre de las variables nos revela cuál código fue escrito por un principiante o por un desarrollador experimentado.
En un proyecto real, la mayor parte de el tiempo se pasa modificando y extendiendo una base de código en vez de empezar a escribir algo desde cero. Cuando regresamos a algún código después de hacer algo distinto por un rato, es mucho más fácil encontrar información que está bien etiquetada. O, en otras palabras, cuando las variables tienen nombres adecuados.
Por favor pasa tiempo pensando en el nombre adecuado para una variable antes de declararla. Hacer esto te da un retorno muy sustancial.
Algunas reglas buenas para seguir:
- Use términos legibles para humanos como
userName
pshoppingCart
. - Evite abreviaciones o nombres cortos
a
,b
,c
, al menos que en serio sepa lo que está haciendo. - Cree nombres que describen al máximo lo que son y sean concisos. Ejemplos que no son adecuados son
data
yvalue
. Estos nombres no nos dicen nada. Estos solo está bien usarlos en el contexto de un código que deje excepcionalmente obvio cuál valor o cuales datos está referenciando la variable. - Acuerda en tu propia mente y con tu equipo cuáles términos se utilizarán. Si a un visitante se le llamara “user”, debemos llamar las variables relacionadas
currentUser
onewUser
en vez decurrentVisitor
onewManInTown
.
¿Suena simple? De hecho lo es, pero no es tan fácil crear nombres de variables descriptivos y concisos a la hora de practicar.
⚠️
¿Reusar o crear?
Una última nota. Existen programadores haraganes que, en vez de declarar una variable nueva, tienden a reusar las existentes.
El resultado de esto es que sus variables son como cajas en las cuales la gente introduce cosas distintas sin cambiar sus etiquetas. ¿Que existe dentro de la caja? ¿Quién sabe? Necesitamos acercarnos y revisar.
Dichos programadores se ahorran un poco durante la declaración de la variable, pero pierden diez veces más a la hora de depuración.
Una variable extra es algo bueno, no algo malvado.
Los minificadores de JavaScript moderno, y los navegadores optimizan el código suficientemente bien para no generar cuestiones de rendimiento. Utilizar diferentes variables para distintos valores incluso puede ayudar a optimizar su código
Hoisting
Hoisting es uno de esos términos que todos los desarrolladores de JS han oído hablar porque buscaste en Google tu molesto error y terminaste en StackOverflow, donde esta persona te dijo que este error fue causado por hoisting.
📝
Definición
Es un comportamiento por el cual las declaraciones de variables y funciones se "mueven" al principio del contexto de ejecución (scope) antes de que el código se ejecute. Sin embargo, esto no significa que el código en sí cambie de lugar, sino que las variables y funciones están disponibles antes de su declaración en el código fuente.
Variables
En el caso de las variables declaradas con var
, el hoisting hace que la declaración se mueva al principio del bloque, pero su inicialización se mantiene donde está en el código. Esto significa que, aunque puedas acceder a una variable antes de su declaración, su valor será undefined
hasta que se asigne.
Con las variables declaradas usando let
o const
, el comportamiento es diferente. Aunque la declaración también se "eleva", no puedes acceder a la variable antes de su declaración debido al Temporal Dead Zone (TDZ), lo que produce un error si intentas usarla antes de tiempo.
Funciones
En el caso de las funciones declaradas, todo el bloque de código de la función se eleva, lo que te permite invocarla antes de su declaración.
Sin embargo, si declaras funciones mediante expresiones de función asignadas a variables (const
o let
), el comportamiento es diferente, ya que el hoisting solo afectará a la declaración de la variable, pero no a la asignación de la función. Esto significa que no podrás invocar la función antes de que se asigne.
Alcance
El alcance o ámbito de una variable en JavaScript se refiere al contexto en el que dicha variable es accesible dentro del código. Hay dos tipos principales de alcance:
Alcance global
El alcance global es el ámbito de las variables que se declaran fuera de cualquier función. Las variables globales se pueden acceder desde cualquier parte del código, incluidas otras funciones, objetos y propiedades.
Declarar variables globales
Para declarar una variable global, se puede utilizar la palabra clave var
. Por ejemplo:
También se puede declarar una variable global sin usar la palabra clave var
. Sin embargo, esto se considera una mala práctica, ya que puede causar errores y dificultar el mantenimiento del código.
⚠️
Diferencia entre declarar una variable global con `var`, `let` y `const`
La diferencia radica en que cuando declaramos con var
de forma global la variable será parte del objeto global window
(en navegadores) o global
(en node.js), mientras que si la declaramos con las palabras reservadas let
o const
estas no serán añadidas al objeto global.
Acceso a variables globales
Para acceder a una variable global, se puede utilizar su nombre sin ningún modificador de alcance. Por ejemplo:
Ejemplos de alcance global
El alcance global se puede utilizar para compartir datos entre funciones y objetos. Por ejemplo:
En este ejemplo, la variable nombre
se declara globalmente. La función saludar()
utiliza la variable nombre
para saludar al usuario. El objeto persona
también utiliza la variable nombre
para almacenar el nombre de la persona.
Alcance local
En JavaScript, el alcance local se puede dividir en dos tipos:
Alcance de bloque
Este tipo de alcance se aplica a las variables declaradas con let
o const
dentro de cualquier bloque delimitado por llaves {}
, como en condicionales (if
), bucles (for
, while
) o simplemente bloques anidados. Las variables definidas dentro de estos bloques no son accesibles fuera de ellos.
Alcance de función
Es un tipo más específico de alcance local que se refiere a las variables declaradas dentro de una función. Estas variables, incluso si se usan var
, let
o const
, son accesibles solo dentro de la función donde se declaran y no pueden ser accedidas desde fuera de ella.