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的一个描述,为了我们好区分它。

posted @ 2019-12-05 18:16  meetqy  阅读(6561)  评论(0编辑  收藏  举报