En JavaScript, los valores siempre pertenecen a un tipo de dato concreto. Esta tipología indica cómo se representa ese valor y qué operaciones pueden realizarse con él. Por ejemplo, una cadena de texto ("Hola") pertenece al tipo string, mientras que un número (55) pertenece al tipo number.
Existen ocho tipos de datos: los siete que se clasifican como primitivos y los objetos. Los tipos primitivos, como string, number o boolean, son valores inmutables, mientras que los objetos son estructuras de datos complejas con propiedades y métodos. Además, en JavaScript las funciones también se consideran valores, ya que en realidad son un tipo especial de objeto.
Una particularidad de JavaScript es que es un lenguaje de tipado dinámico. Esto significa que no es necesario que el desarrollador indique de antemano el tipo de dato de una variable. El motor del lenguaje lo determina de forma automática según el valor asignado o el resultado de una operación.
Por ejemplo, podemos declarar una variable con una cadena de texto y luego almacenar un número en el mismo espacio de memoria. Todo ello sin tener que indicar en ningún momento el tipo de dato almacenado.
let x = "abc"; // Es un string
x = 2; // Ahora es un número
Los tipos de datos son fundamentales en cualquier lenguaje de programación y conocerlos a fondo ayuda a evitar resultados inesperados al trabajar con valores. Por ejemplo, en JavaScript, si sumamos "10" + 10 el resultado será 1010 en lugar de 20, porque el primer valor es una cadena de texto y se produce una concatenación en vez de una operación matemática.
let sum = "10" + 10; // 1010
En este ejemplo, el motor de JavaScript detecta que el primer operando es una cadena de texto (string), por lo que convierte el segundo en otra cadena de texto. Entonces realiza una concatenación en vez de una suma aritmética.
Tipos primitivos
Los tipos de datos primitivos son inmutables por naturaleza. No hay que confundir la inmutabilidad con la capacidad de reasignación. Una variable puede reasignarse para contener otro valor, pero el valor primitivo en sí no cambia: simplemente se reemplaza por un nuevo valor. En este aspecto, los valores primitivos son totalmente diferentes de los objetos, que sí son mutables.
Desde la versión ECMAScript 6 (ES6 o ES2015) hay siete tipos de datos primitivos: los números enteros y decimales (number), números enteros grandes (BigInt), cadenas de texto (string), valores lógicos o booleanos, ausencia de valor (null), valor no asignado (undefined) y símbolos (symbol) que permiten representa identificadores únicos.
Números
En JavaScript, los números se almacenan como tipo number, sin diferenciar los enteros de los decimales. Internamente, este tipo utiliza el formato de punto flotante de 64 bits, definido por el estándar «IEEE 754», lo que permite representar números grandes y con decimales, aunque con ciertas limitaciones de precisión.
Por ejemplo:
let numero1 = 5000; // Entero
let numero2 = 5000.0; // Decimal
Si es necesario trabajar con números enteros muy grandes, JavaScript ofrece el tipo BigInt, que permite representar enteros de tamaño casi ilimitado y con precisión exacta. Se especifica con el sufijo n al final del número.
Por ejemplo:
let muylargo = 1234567890123456789012345678901234567890n;
Dentro del tipo number existen tres valores especiales llamados simbólicos: Infinity, -Infinity y NaN. Los dos primeros representan el infinito positivo y negativo; aparecen, por ejemplo, al dividir entre cero.
El valor NaN significa «Not a Number» (no es un número) y se obtiene cuando una operación matemática no produce un resultado numérico válido. Esto sería el caso de multiplicar una cadena de texto por un número ("hola" * 3).
Texto
Una cadena de texto es una secuencia de caracteres que se almacena como tipo string. Puede contener desde un solo carácter hasta múltiples palabras. Se puede generar mediante tres maneras diferentes: usando las comillas simples (''), comillas dobles ("") o acentos graves (``).
Todos estos ejemplos son válidos:
let web = 'Recursivos';
let web = "Recursivos";
let web = `Recursivos`;
Valores lógicos
Los valores lógicos o booleanos son de tipo boolean y solo pueden almacenar dos valores: true (verdadero) y false (falso). Este tipo de dato es muy útil en expresiones condicionales, como las que se usan en if, while o al evaluar comparaciones. Ayudan mucho a controlar el flujo del programa.
Por ejemplo, el resultado de la comparación 6 > 3 devuelve true, mientras que 2 === 3 devuelve false. Pero también podemos almacenar directamente un valor booleano en una variable, de esta manera:
let booleano = true;
Valor ‘undefined’
Cuando se declara una variable en JavaScript sin asignarle un valor (no inicializada) su valor por defecto será undefined. También es posible asignar manualmente el valor undefined, pero no se recomienda, ya que lo utiliza el propio motor de JS para indicar que la variable aún no tiene un valor definido.
Por ejemplo:
let sinValor; // Por defecto es undefined
var sinValor; // Por defecto es undefined
let manual = undefined; // No recomendado
Valor ‘null’
El valor nulo (null) se usa para indicar de forma intencional la ausencia de valor. A diferencia de undefined, que aparece automáticamente, null lo asigna el desarrollador de manera explícita. Es común utilizarlo para reiniciar o inicializar una variable que hará referencia a un objeto más adelante.
Por ejemplo:
let sinValor = null;
Símbolo
El tipo primitivo symbol permite crear valores únicos e inmutables. Se generan con el constructor Symbol(), al que se le puede pasar una cadena de texto como parámetro. Debido a su unicidad, se utilizan sobre todo como claves de propiedades en objetos, evitando colisiones con otras propiedades.
Por ejemplo:
let id = Symbol('identificador');
Tipos de referencia
Los tipos de referencia, también conocidos como objetos o tipos compuestos, no almacenan directamente el valor en la variable, sino una referencia al espacio de memoria donde se encuentra. De este modo, permiten trabajar con estructuras complejas como los objetos literales, los arrays y las funciones.
Objetos
En JavaScript, los objetos son colecciones de pares clave–valor. Cada clave es una propiedad (un nombre) y cada valor puede ser de cualquier tipo de dato, incluso otro objeto o función. Se escriben entre llaves ({}).
Ejemplo de un objeto literal:
let lenguaje = {
nombre: "JavaScript",
creador: "Brendan Eich"
}
Arrays
Los arrays son listas ordenadas de elementos fácilmente accesibles mediante un índice numérico que empieza en 0. Pueden contener elementos de diferentes tipos de datos en la misma colección. Se escriben entre corchetes ([]).
Por ejemplo:
let lenguajes = ["html", "css", "js"]
Funciones
En JavaScript, las funciones son un subtipo especial de objeto: pueden guardarse en variables, pasarse como argumento a otra función y devolverse como valor de otra función. Además de poder ejecutarse, también pueden tener propiedades y métodos propios, como cualquier objeto.
Por ejemplo:
function saludar(nombre) {
return "Hola, " + nombre;
}
saludar('Juan');