Explicación sobre Set en JavaScript
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étodo | Descripción |
---|---|
.size | Indica 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ística | Set | WeakSet |
---|---|---|
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() | ✅ | ❌ |