符号与符号属性

Thursday, August 22, 2019

第六章 符号与符号属性

创建符号值

描述值为可选,但建议提供描述值,不能使用 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"

使用知名符号暴露内部方法