zoukankan      html  css  js  c++  java
  • js学习-es6实现枚举

    最近大部分时间再写dart,突然用到js,发现js不能直接声明一个枚举。搜索发现还是有实现的方式,于是总结一下。

    目录

    枚举特点

    • 枚举值不能重复
    • 不能被修改
    • switch case可以直接判断

    Object.freeze()

    Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。(来自MDN

    总结:让被冻结的对象,不能再修改。

    Symbol

    ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。(来自ECMAScript 6 入门-阮一峰)

    总结:凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

    实现

    体现不可更改

    const EnumSex = Object.freeze({
        man: Symbol('男'),
        woman: Symbol('女')
    })
    
    EnumSex.man = 1;
    console.log(EnumSex.man); // Symbol(男)
    

    体现值的唯一性

    const EnumSex = Object.freeze({
        man: Symbol('男'),
        woman: Symbol('男')
    })
    
    console.log(EnumSex.man === EnumSex.woman); // false
    

    需要注意的地方

    开始实现体现值的唯一性的时候,看到man和woman都是Symbol('男'),感觉执行的时候应该会报错,结果没有报错,还有点怀疑Symbol的唯一性。最后一对比发现是不同的。

    Symbol中的参数只是对Symbol的一个描述,为了我们好区分它。

  • 相关阅读:
    FZU 2129 子序列个数(DP)题解
    FZU 2082 过路费(树链剖分 边权)题解
    2019牛客多校第一场E ABBA(DP)题解
    ajax解决csrf的跨站请求伪造
    django实现简单的跨域请求数据
    python 与jQuery之间的接口对应
    GO语言的初次学习
    Django一些常用参数的设置
    auth认证模块
    Django中间件模块的使用
  • 原文地址:https://www.cnblogs.com/meetqy/p/11990977.html
Copyright © 2011-2022 走看看