Symbol详解

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 这种可见性修饰符的不足。

  1. 维护一个 mapping,消除魔法字符const tabTypes = {basic: Symbol(),super: Symbol()}
  2. obj 的某个 keysymbol 来做,可以避免失误型二次赋值除非 真的要重新赋值就 这样:obj[Symbol.for('key')] = xxx
  3. 利用 Symbol 的唯一性来模拟 class 的 private 属性 class xx { [Symbol()](){statement} }

Symbol 构造函数创建的 local-symbol 和 Symbol.for()创建的 global-symbol 不同
https://blog.yangerxiao.com/posts/javascript-symbol

。。。todo complete


   转载规则


《Symbol详解》 Ryan Who 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
玩具 - 爬虫 MDN 玩具 - 爬虫 MDN
就当他是个 MDN Menu 吧
2021-05-31
下一篇 
Low code & No code Low code & No code
引言最近几年都在讨论什么呢?云技术、中台、敏捷、大前端、低代码。你会发现上面的几个技术,本质上实际上并不是面向开发者的,而是面向老板,或者说面向资本的。因为可以多快好省,所以才得到吹捧。不论我们是否愿意,一切都会向着更快、成本更低的方向发展
2021-05-26
  目录