Symbol
Symbol
ES6 引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
Symbol 值通过 Symbol 函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
注意,Symbol 函数前不能使用 new 命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。
{
let a1 = Symbol.for("abc");
let obj = {
[a1]: "123", //参考api中对象的扩展部分中属性名表达式,这里[a1]代表变量a1的key
abc: "123",
c: 456,
};
console.log("obj", obj);
}
{abc: "123", c: 456, Symbol(abc): "123"}
可以看到两个abc是不冲突的
Symbol()
每个从 Symbol() 返回的 symbol 值都是唯一的。一个 symbol 值能作为对象属性的标识符
console.log(Symbol("foo") === Symbol("foo"));
// Expected output: false
Symbol.for()
和 Symbol() 不同的是,用 Symbol.for() 方法创建的 symbol 会被放入一个全局 symbol 注册表中。Symbol.for() 并不是每次都会创建一个新的 symbol,它会首先检查给定的 key 是否已经在注册表中了。假如是,则会直接返回上次存储的那个。否则,它会再新建一个
Symbol.for("bar") === Symbol.for("bar"); // true,证明了上面说的