Symbol
需计算字面量属性时使用
const benz = Symbol(‘benz‘);
const car = {
[benz]: ‘benz car‘
};
const info = Symbol(‘my car info‘);
// 此时定义info为可枚举属性
Object.defineProperty(car, info, {
value: ‘benz car description‘,
enumerable: true
});
// 定义price为不可枚举属性
Object.defineProperty(car, ‘price‘, {
value: 1000000
});
注意上例中info与price均不可枚举,无法使用 for-in
遍历, 使用 Object.keys
也无法得到属性名。符号类型的属性均不可被枚举。
共享符号
Symbol.for
会搜索全局符号注册表,查找以传入的参数为键值,找到即返回该符号值,找不到再创建一个符号值并返回该值。
Symbol.keyFor
可以根据符号值在全局符号注册表中返回检索出的键值。
符号值的转换
符号值无法转换为字符串和数字,所以将符号值做为对象属性所带来的效果是其他类型无法替代的。将符号值与字符串进行拼接时会发生错误。
检索对象属性
我们将对象的属性分为符号值属性和普通属性,使用 Object.keys
或者 Object.getOwnPropertyNames
可以拿到对象的普通属性,前者拿到的是可枚举的普通属性,后者是所有普通属性,这样是为了兼容ES5,ES6里新增了 Object.getOwnPropertySymbols
用来检索符号值属性,不管符号值属性可不可枚举都能拿到。