Тест: Symbol и перечислимые свойства
Вы знакомы с менее известными особенностями ES2015?
Quiz: JavaScript Interfaces, Symbols, and Enumerables
- Докажите своё мастерство в JavaScript! 🚀
- Регистрации и входа не требуется. ✨
- Выбор из нескольких вариантов. 🤖 … Насколько это может быть сложным, а?
Как следует получать свойство объекта 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)]