DanLevy.net

クイズ: シンボルと列挙可能

ES2015のあまり知られていない部分、知っていますか?

Quiz: JavaScript Interfaces, Symbols, and Enumerables

getter メソッドを持つ JavaScript オブジェクトのプロパティにはどうアクセスすべきですか?

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

JavaScript では、getter は通常のプロパティと同様にアクセスできます。関数のように呼び出す必要はありません。 この例では、obj.val に直接アクセスすると getter メソッドが呼び出され、got it! と出力されます。

JavaScript オブジェクトで真にユニークなプロパティキーを作成する正しい方法は何ですか?

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

Symbol はユニークで不変なプリミティブ型で、オブジェクトのプロパティキーとして使用できます。これにより、特に大規模なコードベースや再利用可能なライブラリを書く際に、名前の衝突を回避できます。

for...in ループ中にプロパティ age は列挙されますか?

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

Object.defineProperty()enumerable プロパティは、for...in のような列挙メソッドでプロパティが表示されるかどうかを制御します。この例では enumerable: true なので、age プロパティはイテレーション中に列挙されます。

enumerable を指定せずに Object.defineProperty() を使用した場合、プロパティのデフォルトの列挙可能性は何ですか?

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() の呼び出しは、たとえ説明が同じでも、ユニークで不変な値を生成します。この場合、sym1sym2 は異なるシンボルなので、比較は false を返します。

for...in ループ中に Symbol キーのプロパティは列挙されますか?

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

Symbol キーのプロパティは独自の enumerable フラグを持てますが、for...inObject.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)]