前置
1.ES6 引入了一種新的原始資料型別Symbol,表示獨一無二的值。
2.Symbol 值通過Symbol函式生成。
3.Symbol 函式可以接受一個字串作為引數,表示對 Symbol 例項的描述,主要是為了在控制檯顯示,或者轉為字串時,比較容易區分。
4.ES2019 提供了一個例項屬性description,直接返回 Symbol 的描述。
5.Symbol 值都是不相等的,這意味著 Symbol 值可以作為識別符號,用於物件的屬性名,就能保證不會出現同名的屬性。
6.Symbol 值作為物件屬性名時,不能用點運算子,要使用[]
。
7.Symbol 值作為屬性名時,該屬性還是公開屬性,不是私有屬性。
let s = Symbol();
let obj = {
[s]: function (arg) { ... }
};
obj[s](123);
常用場景
定義一組常量,保證這組常量的值都是不相等的
DEMO1
const 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');
DEMO2
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 值最大的好處,就是其他任何值都不可能有相同的值了,因此可以保證上面的switch語句會按設計的方式工作。
作為物件的key屬性, 防止物件屬性被重寫
let name = Symbol();
{
plugin = {};
plugin[name] = 'plugin';
console.log(plugin[name]); //plugin
}
{
let name = Symbol();
plugin[name] = 'user';
console.log(plugin[name]); //user
}
console.log(plugin) //{Symbol(): "plugin", Symbol(): "user"}
console.log(plugin[name]); //plugin