Saltar al contenido principal

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"