Los Set en JavaScript son estructuras de datos incorporadas en el lenguaje que permiten almacenar colecciones de valores únicos. Es decir, no aceptan elementos duplicados, lo que los hace ideales para representar conjuntos.

jsCopiarEditarconst set1 = new Set();                     // Set vacío
const set2 = new Set([5, 6, 7, 8, 9]);      // Set con cinco elementos únicos
const set3 = new Set([5, 5, 7, 8, 9]);      // Set con cuatro elementos (el 5 no se repite)

Puedes verificar que se trata de un conjunto con:

jsCopiarEditarset2.constructor.name; // "Set"

¿Qué es un Set?

Un Set es una colección en la que cada valor aparece una sola vez. Si se intenta añadir un valor que ya existe, este no será insertado. Esto significa que no es necesario validar duplicados manualmente, ya que el conjunto lo hace automáticamente.


Métodos y propiedades de Set

Propiedad / MétodoDescripción
.sizeIndica cuántos elementos hay en el set.
.add(valor)Añade un valor si aún no existe. Retorna el propio set.
.has(valor)Comprueba si un valor está presente. Retorna true o false.
.delete(valor)Elimina el valor si existe. Retorna true si lo borra.
.clear()Vacía completamente el set.

Uso de .size

La propiedad .size indica la cantidad de elementos únicos dentro del set:

jsCopiarEditarconst set = new Set([5, 6, 6, 7]);
console.log(set.size); // 3

Agregar valores con .add()

Podemos añadir diferentes tipos de elementos (números, strings, objetos, etc.):

jsCopiarEditarconst set = new Set();

set.add(42);
set.add("JS");
set.add(42);  // Ignorado por ser duplicado

console.log(set); // Set { 42, "JS" }

Convertir Set a Array y viceversa

Un Set se puede transformar fácilmente en un array usando el operador spread (...):

jsCopiarEditarconst conjunto = new Set([5, "A", [1, 2]]);
const array = [...conjunto];

console.log(array); // [5, "A", [1, 2]]

⚠️ Si el set contiene objetos o arrays, recuerda que se copian por referencia. Para hacer una copia profunda (que no modifique el original), puedes usar structuredClone():

jsCopiarEditarconst original = new Set([[1, 2]]);
const copiaSegura = [...structuredClone(original)];

copiaSegura[0][0] = "modificado";
console.log([...original][0][0]); // 1 (el original no se altera)

Para convertir un array en un set:

jsCopiarEditarconst numeros = [1, 2, 2, 3];
const sinDuplicados = new Set(numeros);

console.log(sinDuplicados); // Set { 1, 2, 3 }

¿Qué es un WeakSet?

Los WeakSet son similares a los Set, pero con algunas diferencias clave. Solo pueden contener objetos (no tipos primitivos) y no permiten conocer su tamaño ni recorrerlos.

jsCopiarEditar// Válido
const ws = new WeakSet([{ nombre: "Ana" }, [1, 2]]);

// No válido
const ws2 = new WeakSet([1, "texto", true]); // TypeError

Recolección de basura en WeakSet

En un WeakSet, si un objeto ya no tiene referencias en el código, será eliminado automáticamente por el recolector de basura:

jsCopiarEditarlet obj = { nombre: "JS" };
const ws = new WeakSet([obj]);

obj = null; // El objeto será eliminado automáticamente del WeakSet en algún momento

🚨 Ten en cuenta que la recolección de basura no ocurre inmediatamente, sino cuando el motor de JavaScript lo considera necesario.


Comparativa entre Set y WeakSet

CaracterísticaSetWeakSet
Permite elementos duplicados
Acepta tipos primitivos
Borra automáticamente objetos no usados
Es iterable
Tiene propiedad .size
Métodos .add(), .has(), .delete()
Método .clear()