Symbol 英文意思为 符号、象征、标记、记号,在 js 中更确切的翻译应该为 独一无二的值
const s = Symbol('key用来描述这个symbol值')
这里的参数 key 其实只是 对 symbol 的描述,可用于调试但不是访问 symbol 本身的途径。_(因为即使是传入相同的参数,生成的 symbol 值也是不相等的)_
(需要注意的是通过 Symbol 方法创建值的时候不用使用 new 操作符,原因是通过 new 实例化的结果是一个 object 对象,而不是原始类型的 symbol)
Symbol.for(xx)
: 检测上下文中是否已经存在使用该方法且相同参数创建的 symbol 值,如果存在则返回已经存在的值,如果不存在则新建。Symbol.keyFor(Symbol.for("foo")) === "foo"
: 返回一个使用 Symbol.for 方法创建的 symbol 值的 key
Symbol.iterator
mdn 覆盖定义某个 object 的默认 iterator 迭代方法,Used by for...of
const obj1 = {};
obj[Symbol.iterator] = = function* () {
yield 1;
yield 2;
yield 3;
};
console.log([...iterable1]); // Array [1, 2, 3]
Symbol.asyncIterator
mdn
覆盖定义某个 object 的默认 AsyncIterator 迭代方法,Used by**for await...of
**
应用场景:
用 Symbol 的最常见场景就是可以用来模拟私有属性或方法了,弥补了 JS 没有 OOP 语言常见的 private、public 这种可见性修饰符的不足。
- 维护一个 mapping,消除魔法字符 如
const tabTypes = {basic: Symbol(),super: Symbol()}
- obj 的某个
key
用symbol
来做,可以避免失误型二次赋值。除非 真的要重新赋值就 这样:obj[Symbol.for('key')] = xxx
- 利用 Symbol 的唯一性来模拟 class 的 private 属性
class xx { [Symbol()](){statement} }
Symbol 构造函数创建的 local-symbol 和 Symbol.for()创建的 global-symbol 不同
https://blog.yangerxiao.com/posts/javascript-symbol
。。。todo complete