天天看點

ES6 symbol 以及symbol的簡單應用

前置

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