ES6-Symbol

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 类型,它所提供的具体方法不再一一介绍,大家可以自己摸索使用哈~

你可能感兴趣的:(ES6-Symbol)