ES6 之 Symbol

基本概念

Symbol 的用法其实很简单,就是创建一个独一无二的值。
举个例子:

1
Symbol() == Symbol() // false

需要注意的是,不能使用 new 创建 Symbol ,因为 Symbol 是一个基本类型。

通常在使用 Symbol 的时候,会在其中加入标识符,例如:

1
2
3
4
5
6
7
8
Symbol('foo') // Symbol(foo)

Symbol('foo') == Symbol('foo') // false

Symbol('foo').toString() // "Symbol(foo)"

Symbol('foo').toString() === Symbol('foo').toString() // true

SymboltoString() 方法

主要使用场景

作为对象的属性名

1
2
3
4
5
let o = {}
let mySymbol = Symbol()

o[mySymbol] = 'xxx'

需要注意的是,使用 Symbol 作为属性名时,要用 [] 的方式访问,因为点符号后面跟的只能时字符串。

定义常量

保证这些常量不相等

1
2
3
4
5
6
7
8
9
let log = {}
log.levels = {
DEBUG: Symbol('debug'),
INFO: Symbol('info'),
WARN: Symbol('warn')
};
console.log(log.levels.DEBUG, 'debug message')
console.log(log.levels.INFO, 'info message')

保证 Switch 按照设计使用

1
2
3
4
5
6
7
8
9
10
11
12
13
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 还有一些其他方法,请参阅读MDN Web Docs

不过需要特别注意的是,Symbol 定义的属性名,在使用 for...infor...of 等需要有迭代器的方法时不会出现,要获得一个对象所有的Symbol 属性名可以使用 Object.getOwnPropertySymbols() 方法。