DanLevy.net

Cuestionario: Símbolos y Enumerables

¿Dominaslos rincones menos conocidos de ES2015?

Quiz: Interfaces de JavaScript, Symbols y Enumerables

¿Cómo deberías acceder a una propiedad de un objeto JavaScript que usa un método getter?

const obj = {
get val() {
return 'got it!';
}
};
console.log(obj.val);

En JavaScript, un getter se puede acceder como una propiedad normal. No es necesario llamarlo como una función. En este ejemplo, acceder a obj.val invoca directamente el método getter y muestra got it!.

¿Cuál es la forma correcta de crear una clave de propiedad verdaderamente única para un objeto JavaScript?

const uniqueKey = Symbol('myUniqueKey');
const obj = {
[uniqueKey]: 'unique value'
};
console.log(obj[uniqueKey]);

Los Symbols son un tipo primitivo único e inmutable que pueden usarse como claves para propiedades de objetos. Esto ayuda a evitar colisiones de nombres, especialmente en bases de código grandes o al escribir bibliotecas reutilizables.

¿Se listará la propiedad age durante una iteración for...in?

const person = {};
Object.defineProperty(person, 'age', {
value: 25,
enumerable: true
});
for (let key in person) {
console.log(key);
}

La propiedad enumerable en Object.defineProperty() controla si la propiedad aparecerá en métodos de enumeración como for...in. En este ejemplo, como enumerable: true, la propiedad age se listará durante la iteración.

¿Cuál es la enumerabilidad predeterminada de una propiedad al usar Object.defineProperty() sin especificar enumerable?

const car = {};
Object.defineProperty(car, 'make', {
value: 'Toyota'
});
console.log(Object.keys(car));

Cuando usas Object.defineProperty() sin especificar enumerable, su valor predeterminado es false. Esto significa que la propiedad make no aparecerá en Object.keys() ni en otros métodos de enumeración.

¿Cuál será el resultado de la siguiente comparación?

const sym1 = Symbol('id');
const sym2 = Symbol('id');
console.log(sym1 === sym2);

Cada llamada a Symbol() crea un valor único e inmutable, incluso si la descripción es la misma. En este caso, sym1 y sym2 son símbolos diferentes, por lo que la comparación devuelve false.

¿Se listará la propiedad con clave Symbol durante una iteración for...in?

const sym = Symbol('uniqueKey');
const obj = {
[sym]: 'symbol value',
regularKey: 'regular value'
};
for (let key in obj) {
console.log(key);
}

Las propiedades con clave Symbol pueden tener su propia bandera enumerable, pero for...in y Object.keys() solo recorren propiedades enumerables con clave de tipo string. En este ejemplo, solo se listará regularKey, no la propiedad con clave Symbol.

¿Qué método se puede usar para obtener todas las claves Symbol de un objeto?

El método Object.getOwnPropertySymbols() se usa para obtener las claves de propiedades Symbol propias de un objeto.

const sym1 = Symbol('id');
const sym2 = Symbol('name');
const obj = {
[sym1]: 'symbol value',
[sym2]: 'another symbol value'
};
console.log(Object.getOwnPropertySymbols(obj));
// [Symbol(id), Symbol(name)]