1.简单使用
Symbol函数接受一个可选参数,添加描述创建的symbol,不可用于访问,被存储在内部的description属性中,只有调用toString方法才可以读取。可以通过typeof判断类型。
let firstName = Symbol("first name");
let person = {};
person[firstName] = "Nicolas";
console.log("first name" in person); // false
console.log(person[firstName]); // "Nicolas"
console.log(firstName); // "Symbol(first name)"
console.log(typeof firstName); // "symbol"
2.共享体系
使用同一个symbol属性来表示一个独特的标识符,如:
let uid = Symbol.for("uid");
let obj = {
[uid]: "12345"
}
console.log(obj[uid]); // "12345"
let uid2 = Symbol.for("uid");
console.log(uid === uid2); // true
console.log(obj[uid2]); // "12345"
console.log(uid2); // "Symbol(uid)"
console.log(Symbol.keyFor(uid2)); // "uid"
let uid3 = Symbol("uid");
console.log(Symbol.keyFor(uid3)); // undefined
Symbol.for()首先在全局Symbol注册表中搜索键为uid的Symbol是否存在,如果存在直接返回已有的Symbol;否则,创建一个新的Symbol并在全局中注册。Symbol.keFor()在全局注册表中检索与Symbol有关的键。
3.属性检索
Symbol不能强制转换为其他类型,因此不能与字符串拼接及数值运算。
要用Object.getOwnPropertySymbols()来检索对象中的Symbol属性,如:
let uid = Symbol.for("uid");
let obj = {
[uid]: "12345"
}
let symbols = Object.getOwnPropertySymbols(obj);
console.log(symbols.length); // 1
console.log(symbols[0]); // "Symbol(uid)"
console.log(obj[symbols[0]]); // "12345"