DanLevy.net

测验:Symbol 与可枚举性

ES2015 那些冷门特性,你了解多少?

测验:JavaScript 接口、Symbol 与可枚举性

你应该如何访问一个使用了 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: trueage 属性在迭代期间会被列出。

在使用 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() 都会创建一个唯一且不可变的值,即使描述内容相同也是如此。在这个例子中,sym1sym2 是两个不同的 symbol,因此比较结果返回 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)]