JS 乐园: Symbol

182 阅读1分钟

概念

  • Symbol 有唯一性, 可以用来做 private, Symbol 不是对象.
  • 可以接受 字符串 作为参数, 表示对 Symbol 实例的描述, 用于区分.
  • 如果参数 为 对象, 就会调用该对象的 toString方法, 将其转为字符串, 才生成一个 Symbol 值.
  • 利用Symbol的唯一性(每一个 Symbol 返回的都是独一无二的, 即使传入的参数是是一样的字符串), 可以用来防止 对象 中的 属性名字的冲突.
  • 6种基本类型之一: undefined, null,Boolean, String,Number, Symbol
  • Symbol 不能与其他类型的值进行运算, 会报错

举例

 let a = Symbol();
 typeof a // "symbol",

上面 a 就是独一无二的, typeof 运算符的结果就是表明a 是 Symbol 数据类型,而不是字符串之类的的其他类型.

Symbol.for()

它接受一个字符串作为参数,然后搜索有没有以该参数作为名称的 Symbol 值。如果有,就返回这个 Symbol 值,否则就新建一个以该字符串为名称的 Symbol 值,并将其注册到全局。

let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');
s1===s1 // true;

Symbol.for()为 Symbol 值登记的名字,是全局环境的,不管有没有在全局环境运行. 例如:

frame = document.createElement('iframe');
iframe.src = String(window.location);
document.body.appendChild(iframe);

iframe.contentWindow.Symbol.for('foo') === Symbol.for('foo')
// true