Symbol
基础知识
- Symbol 用于防止属性名冲突而产生的,比如向第三方对象中添加属性时。
- Symbol 对象不可以添加属性。
let mySymbolA = Symbol();
描述参数
let mySymbolB = Symbol("这是一个测试");
mySymbolB.description
- 和 Symbol() 不同的是,用 Symbol.for() 方法创建的的 symbol 会被放入一个全局 symbol 注册表中。
- Symbol.for() 并不是每次都会创建一个新的 symbol,它会首先检查给定的 key 是否已经在注册表中了。
- 假如是,则会直接返回上次存储的那个。否则,它会再新建一个。
let mySymbolC = Symbol.for('这是 key');
Symbol.keyFor(mySymbolC)
对象属性
- 对象 的 key 默认当作字符串处理,[key] 会当作变量处理
- ymbol 声明和访问使用 [](变量)形式操作
- 也不能使用 . 语法因为 .语法是操作字符串属性的。
let mySymbolD = Symbol();
let obj = {
name: 'alrcly',
[mySymbolD]: "www.alrcly.com"
};
console.log(obj[mySymbolD]);
遍历属性
- Symbol 不能使用 for/in、for/of 遍历操作
- 可以使用 Object.getOwnPropertySymbols 获取所有 Symbol 属性
for (const key of Object.getOwnPropertySymbols(obj)) {
console.log(key);
}
- 也可以使用 Reflect.ownKeys(obj) 获取所有属性包括 Symbol
for (const key of Reflect.ownKeys(obj)) {
console.log(key);
}