ES6 中引入了一种新的原始数据类型
Symbol
,表示独一无二的值。
引入的原因:保证每个属性名都是独一无二的,从根本上防止属性名的冲突。
1.关于 Symbol
直接使用 Symbol()
就可以创建一个新的 symbol
变量,
let s = Symbol();
typeof s; // "symbol"
⚠️我们是使用 Symbol() 函数创建 symbol 变量,并非使用构造函数,因此不能使用 new 操作符。
可以接受一个字符串参数
,表示对变量的描述,主要用于区分变量。
let s = Symbol('first');
也可以接受一个对象参数
,将调用对象的toString()方法
let s = Symbol({name: 'xxx'});
⚠️参数只是表示对当前变量的描述,即使是相同参数,返回值都是不想等的,即独一无二的特性。
2.Symbol.for() 与 Symbol.keyFor()
如果我们想要创建两个相等的 symbol
变量,则可以使用 Symbol.for(key)
,该方法生成的变量会被登记在全局环境中,如果使用同一个 key 继续生成一个新的变量,其实两者值都相同。
var s1 = Symbol.for('xxx');
var s2 = Symbol.for('xxx');
s1 === s2 // true
如果想要知道某个变量是否在全局环境中登记过,则可以使用 Symbol.keyFor()
Symbol.keyFor(s1) // 'xxx'
3.使用Symbol作为属性名
let mySymbol = Symbol();
// 第一种写法
let a = {};
a[mySymbol] = 'Hello!';
// 第二种写法
let a = {
[mySymbol]: 'Hello!'
};
// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
// 以上写法都得到同样结果
a[mySymbol] // "Hello!"
⚠️使用 Symbol 值作为对象属性名时,不能用点运算符。因为点运算符后面的属性名实际是一个字符串,而不是 Symbol 值
写在最后:
简单介绍了一下 Symbol 类型,它所提供的具体方法不再一一介绍,大家可以自己摸索使用哈~