前置
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