概念
- 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