zoukankan      html  css  js  c++  java
  • ES6 symbol 以及symbol的简单应用

    前置

    1.ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。
    2.Symbol 值通过Symbol函数生成。
    3.Symbol 函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
    4.ES2019 提供了一个实例属性description,直接返回 Symbol 的描述。
    5.Symbol 值都是不相等的,这意味着 Symbol 值可以作为标识符,用于对象的属性名,就能保证不会出现同名的属性。
    6.Symbol 值作为对象属性名时,不能用点运算符,要使用[]

    let s = Symbol();
    
    let obj = {
      [s]: function (arg) { ... }
    };
    
    obj[s](123);
    

    7.Symbol 值作为属性名时,该属性还是公开属性,不是私有属性。

    常用场景

    定义一组常量,保证这组常量的值都是不相等的

    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
    
    
  • 相关阅读:
    C#中ToString格式大全
    mysql事务
    Mac eclipse 启动卡住
    Mac 安装zkdash
    Mac 安装SecureCRT
    java多线程、并发系列之 (synchronized)同步与加锁机制
    jvm 年轻代
    查看日志技巧
    which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
    tomcat限制内存
  • 原文地址:https://www.cnblogs.com/guangzan/p/11234009.html
Copyright © 2011-2022 走看看