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
    
    
  • 相关阅读:
    php Date()函数输出中文年月日时分秒
    jQuery动态添加删除与添加表行代码
    sql随机查询数据语句(NewID(),Rnd,Rand(),random())
    asp.net 逻辑操作符与(&&),或(||),非(!)
    php static 变量的例子
    asp.net C# int 类型在32/64位环境下取值范围无变化
    js保留小数点后N位的方法介绍
    [Java] LinkedHashMap 源码简要分析
    [Java] HashMap 源码简要分析
    [Java] Hashtable 源码简要分析
  • 原文地址:https://www.cnblogs.com/guangzan/p/11234009.html
Copyright © 2011-2022 走看看