前置
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
来源: https://www.cnblogs.com/guangzan/p/11234009.html