ES6 symbol 以及symbol的簡單應用

__上善若水發表於2019-07-23

前置

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

相關文章