目录
Symbol.for() 、 Symbol.keyFor()
概念:
symbol是一个ES6标准种新增的一种基本数据类型,在JavaScript中,共有七种基本数据类型:string、number、object、boolean、null、undefined、symbol。并且除了null和undefined之外,每个基本类型都有其包装对象。
symbol 的值是通过 Symbol() 函数生成,每一个 symbol 的值都是唯一的,并且 symbol 类型的值可以作为对象的属性标识符使用,这也是 symbol 类型设计的目的。
所以现在对象属性名可以为两种类型:一种就是原本的字符串类型,一种即为新增的 symbol 类型。凡是使用 symbol 命名的属性都是独一无二的,保证不与其他属性名产生冲突。
Symbol 本质上是一种唯一标识符,可用作对象的唯一属性名,这样其他人就不会改写或覆盖你设置的属性值。
基本用法:
let id = Symbol("id");
Symbol 数据类型的特点是唯一性,即使是用同一个变量生成的值也不相等。
let id1 = Symbol('id');
let id2 = Symbol('id');
console.log(id1 == id2); //false
Symbol 数据类型的另一特点是隐藏性,for···in,object.keys() 不能访问
let id = Symbol("id");
let obj = {
[id]:'symbol'
};
for(let option in obj){
console.log(obj[option]); //空
}
JavaScript 中大多数的数值都支持隐式转换为字符串,但 symbol 不会转换,可以手动将 symbol 转换成字符串:
let s1 = Symbol('zth');
alert(s1); // TypeError: Cannot convert a Symbol value to a string
alert(s1.toString());
//但是如果有必要,可以手动将 symbol 转换成字符串
symbol 也不能与其他类型的值进行运算:
console.log('symbol is' + s1); // TypeError: Cannot convert a Symbol value to a string
Symbol.for() 、 Symbol.keyFor()
如果我们要重复使用一个 symbol 时,可以用到 Symbol.for() 方法。Symbol.for() 方法接受一个字符串参数,会在全局中搜索有没有以该参数命名的 symbol 的值,如果查找到就返回这个值。如果没有查到则重新生成一个值,并将该值以参数名称注册到全局。
let s1 = Symbol.for('sm'); // 创建
let s2 = Symbol.for('sm'); // 查找
s1 === s2; // true
Symbol.for() 和 Symbol() 方法都会生成新的 symbol 类型的值,不同的是 Symbol.for() 方法会查找命名参数是否在全局中注册过,如果注册过的就不会创建新的值,而是会直接返回,所以我们可以使用到相同的 symbol 值。但使用 Symbol() 方法每次都会创建一个新的值,且不会注册到全局。
Symbol.keyFor() 方法表示获取一个 symbol 的值在全局中注册的命名参数 key,只有使用 Symbol.for() 创建的值才会有注册的命名参数,使用 Symbol() 生成的值则没有:
let s4 = Symbol('sq');
let s5 = Symbol.for('sq');
Symbol.keyFor(s4); // undefined
Symbol.keyFor(s5); // sq
内置的 symbol 值
除了自定义 symbol 的值,ES6 还提供了 11 个内置的 symbol 值,指向语言内部使用的方法。