1、symbol
ES6 引入了一种新的原始数据类型Symbol
,表示独一无二的值。js的第七种类型。
let s = Symbol();
typeof s//symbol
注意,Symbol
函数前不能使用new
命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。
Symbol
函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
切记:不能使用new创建symbol。
2、作为属性名的 Symbol
对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。由于每一个 Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。
let mySymbol = Symbol();
// 第一种写法
let a = {};
a[mySymbol] = ‘Hello!‘;
// 第二种写法
let a = {
[mySymbol]: ‘Hello!‘
};
注意,Symbol 值作为对象属性名时,不能用点运算符。因为点运算符后面总是字符串。必须使用方括号访问这些属性。
属性的名字是symbol
而不是一个字符串。除此之外,它与一个普通的属性没有什么区别。
用法:
const COLOR_RED = Symbol();
const COLOR_GREEN = Symbol();
function getComplement(color) {
switch (color) {
case COLOR_RED:
return COLOR_GREEN;
case COLOR_GREEN:
return COLOR_RED;
default:
throw new Error(‘Undefined color‘);
}
}
常量使用 Symbol 值最大的好处,就是其他任何值都不可能有相同的值了。
3、Symbol.for
let s1 = Symbol.for(‘foo‘);
let s2 = Symbol.for(‘foo‘);
s1 === s2 // true
Symbol.for()
与Symbol()
这两种写法,都会生成新的 Symbol。它们的区别是,前者会被登记在全局环境中供搜索,后者不会。Symbol.for()
不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key
是否已经存在,如果不存在才会新建一个值。比如,如果你调用Symbol.for("cat")
30 次,每次都会返回同一个 Symbol 值,但是调用Symbol("cat")
30 次,会返回 30 个不同的 Symbol 值。
Symbol.for("bar") === Symbol.for("bar")
// true
Symbol("bar") === Symbol("bar")
// false
4、使用示例
const name=Symbol(‘name‘) let aa={ [name]:‘mfg‘, show(){ console.log(this[name]) } } aa.show();
控制台输出:‘mfg’