DanLevy.net

Тест: Symbol и перечислимые свойства

Вы знакомы с менее известными особенностями ES2015?

Quiz: JavaScript Interfaces, Symbols, and Enumerables

Как следует получать свойство объекта JavaScript, которое реализовано через геттер?

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

В JavaScript геттер можно получать как обычное свойство. Нет необходимости вызывать его как функцию. В этом примере прямой доступ к obj.val вызывает геттер и выводит got it!.

Как правильно создать действительно уникальный ключ свойства для объекта JavaScript?

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

Symbol — уникальный и неизменяемый примитивный тип, который можно использовать в качестве ключей свойств объекта. Это помогает избегать конфликтов имён, особенно в больших кодовых базах или при написании переиспользуемых библиотек.

Будет ли свойство age перечислено при итерации for...in?

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

Свойство enumerable в Object.defineProperty() определяет, будет ли свойство появляться в методах перечисления, таких как for...in. В этом примере, поскольку enumerable: true, свойство age будет перечислено при итерации.

Какова перечисляемость свойства по умолчанию при использовании Object.defineProperty() без указания enumerable?

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

Если вы вызываете Object.defineProperty() без указания enumerable, его значение по умолчанию — false. Это означает, что свойство make не появится в Object.keys() и других методах перечисления.

Каков будет результат следующего сравнения?

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

Каждый вызов Symbol() создаёт уникальное и неизменяемое значение, даже если описание одинаково. В данном случае sym1 и sym2 — разные символы, поэтому сравнение возвращает false.

Будет ли свойство с ключом‑символом перечислено при итерации for...in?

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

Свойства, ключи которых являются Symbol, могут иметь собственный флаг enumerable, но for...in и Object.keys() обходят только перечислимые свойства с строковыми ключами. В данном примере в список попадёт лишь regularKey, а свойство с Symbol‑ключом — нет.

Какой метод можно использовать для получения всех Symbol‑ключей объекта?

Метод Object.getOwnPropertySymbols() используется для получения собственных Symbol‑ключей свойства объекта.

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)]