Tipos de datos
JavaScript es un lenguaje de programación dinámico y versátil que ofrece varios tipos de datos primitivos y complejos. Comprender estos tipos es esencial para escribir código eficiente y evitar errores comunes al trabajar con variables y objetos. A continuación, se exploran los tipos de datos disponibles en JavaScript.
Tipos primitivos
JavaScript tiene 7 tipos de datos primitivos, que son inmutables (no se pueden modificar una vez creados).
Number
El tipo number se utiliza para representar tanto números enteros como decimales. Todos los números en JavaScript, ya sean positivos, negativos o fraccionarios, son de tipo number. JavaScript maneja automáticamente la precisión de los números en la mayoría de los casos, pero es importante recordar que los números se representan utilizando el estándar de punto flotante de doble precisión (IEEE 754), lo que puede llevar a errores de precisión con decimales muy pequeños o muy grandes.
let entero = 42;
let decimal = 3.14;
BigInt
El tipo BigInt permite representar números enteros más allá del límite que soporta el tipo number (2^53 - 1). Este tipo es útil cuando se trabaja con valores muy grandes.
let bigNumber = 1234567890123456789012345678901234567890n;
String
Las cadenas de texto (string) son secuencias de caracteres. Se pueden definir utilizando comillas simples ('), comillas dobles (") o plantillas literales con acentos graves (`), que permiten incluir variables y expresiones dentro de la cadena.
let saludo = "Hola, Mundo";
let name = "Manuel";
let nombre = `Tu nombre es ${name}`; // "Tu nombre es Manuel"
Boolean
Los valores booleanos solo pueden ser true o false. Son fundamentales para la toma de decisiones en estructuras de control, como condicionales y bucles.
let esVerdadero = true;
let esFalso = false;
Symbol
Introducido en ECMAScript 2015 (ES6), el tipo symbol crea valores únicos que son útiles como identificadores de propiedades en objetos, lo que ayuda a evitar colisiones en nombres de propiedades.
let id = Symbol("id");
Undefined
El tipo undefined se asigna a las variables que han sido declaradas pero no inicializadas. También es el valor de retorno de funciones que no tienen una instrucción return.
let noDefinido;
console.log(noDefinido); // undefined
Null
El valor null representa la ausencia intencionada de un valor. Se utiliza cuando se desea establecer explícitamente que una variable no tiene ningún valor asignado.
let sinValor = null;
Tipos de datos complejos
Todo en JavaScript son objetos, excepto los datos de tipo primitivo. Estos objetos podemos denominarlos tipos de datos estructurados, complejos o referenciados. Estos tipos son mutables, es decir, pueden cambiar su valor o estructura después de su creación. Los tipos estructurados permiten organizar y gestionar múltiples valores dentro de una sola entidad. JavaScript incluye una serie de objetos de forma nativa.
Object
Un objeto es una colección de pares clave-valor (key-value). Las claves (o propiedades) son cadenas o símbolos, y los valores pueden ser de cualquier tipo, incluidos otros objetos o funciones. Los objetos son fundamentales para la programación orientada a objetos en JavaScript.
let persona = {
nombre: "Juan",
edad: 30,
saludar: function() {
console.log("Hola, soy " + this.nombre);
}
};
persona.saludar(); // "Hola, soy Juan"
Array
Los arreglos son una forma especial de objetos que almacenan listas de elementos. A diferencia de los objetos tradicionales, los índices de los arreglos son numéricos.
let numeros = [1, 2, 3, 4, 5];
console.log(numeros[0]); // 1
Function
Las funciones en JavaScript también son objetos. Una función es un bloque de código diseñado para realizar una tarea específica y puede ser almacenada en variables, pasarse como argumento a otras funciones o devolver otras funciones.
function suma(a, b) {
return a + b;
}
let resultado = suma(3, 4); // 7
Date
El tipo Date permite trabajar con fechas y horas. Aunque no es un tipo de dato primitivo, es ampliamente utilizado en el desarrollo de aplicaciones que requieren manejar cronogramas o eventos.
let fechaActual = new Date();
console.log(fechaActual);
Maps
Introducidos en ECMAScript 2015, los Map son colecciones de pares clave-valor donde tanto las claves como los valores pueden ser de cualquier tipo de dato. A diferencia de los objetos, los mapas mantienen el orden de inserción de los pares.
let mapa = new Map();
mapa.set('nombre', 'Ana');
mapa.set(1, 'uno');
console.log(mapa.get('nombre')); // "Ana"
Sets
Los Set son colecciones de valores únicos, lo que significa que no puede haber elementos duplicados en ellos. Al igual que los mapas, fueron introducidos en ECMAScript 2015.
let conjunto = new Set([1, 2, 3, 4, 4, 5]);
console.log(conjunto); // Set {1, 2, 3, 4, 5}
WeakMap y WeakSet
Son versiones "débiles" de Map y Set, en las que los elementos no son fuertemente referenciados. Esto significa que si un objeto almacenado en un WeakMap o WeakSet ya no tiene otras referencias, puede ser recogido por el recolector de basura. Esto es útil para optimizar la memoria.
let weakMapa = new WeakMap();
let objeto = {};
weakMapa.set(objeto, 'valor');
Mutabilidad
Un concepto clave en las estructuras de datos es la distinción entre mutabilidad e inmutabilidad:
- Los tipos primitivos (como números y cadenas) son inmutables. Una vez que se crea un valor, no se puede cambiar.
- Los objetos y arrays son mutables, lo que significa que puedes cambiar sus propiedades o elementos sin cambiar la referencia al objeto o array.
let a = [1, 2, 3];
a[0] = 5; // Esto modifica el array original
Conversión de tipos
JavaScript es un lenguaje débilmente tipado, lo que significa que los tipos de datos pueden cambiar dinámicamente. Esto puede suceder de manera implícita o explícita.
Conversión implícita
JavaScript intentará convertir los valores al tipo adecuado cuando sea necesario. Por ejemplo, si se intenta sumar un número con una cadena, el número se convertirá en cadena automáticamente.
let resultado = 5 + "5"; // "55"
Conversión explícita
También se puede forzar la conversión de un tipo a otro utilizando funciones específicas, como Number(), String() o Boolean().
let numero = Number("123"); // 123
let cadena = String(123); // "123"