第六章 符号与符号属性
创建符号值
描述值为可选,但建议提供描述值,不能使用 new 关键字。
let firstName = Symbol("first name");
使用符号值
在“可计算属性名”的场合都能使用符号值。
let person = {
[firstName]: "Nicholas"
};
共享符号值
创建共享符号值,应使用 Symbol.for()
方法而不是 Symbol()
方法。
Symbol.for()
方法仅接受字符串类型的单个参数,作为目标符号值的标识符,此参数同时也会成为该符号的描述信息。
let uid = Symbol.for("uid");
Symbol.for()
会先搜索全局符号注册表,如果有相同键值(标识符)的符号值,则返回该符号值,不存在则创建一个新的。
let uid = Symbol.for("uid");
let object = { [uid]: "12345"};
console.log(object[uid]); // "12345"
let uid2 = Symbol.for("uid");
console.log(uid === uid2); // true
console.log(object[uid2]); // "12345"
console.log(uid2); // "Symbol(uid)"
Symbol.keyFor()
方法可以检索出符号值的键值。
console.log(Symbol.keyFor(uid2)) // uid
符号值的转换
符号值使用String()
方法会返回 Symbol(键值)
,但如果想将其转换成字符串或数值类型则会报错,但可以使用逻辑运算符,符号值在逻辑运算中等价于true
。
检测符号属性
符号属性默认是可枚举的,但Object.keys()
方法是忽略符号属性的。
Object.getOwnPropertySymbols()
方法返回一个数组,包含对象中属性名的符号值。
let uid = Symbol.for("uid");
let object = { [uid]: "12345"};
let symbols = Object.getOwnPropertySymbols(object);
console.log(symbols.length); // 1
console.log(symbols[0]); // "Symbol(uid)"
console.log(object[symbols[0]]); // "12345"