js学习-es6实现枚举

摘要:
最近,我大部分时间都在写dart,突然使用了js。我发现js不能直接声明枚举。目录枚举功能对象冻结()符号实现反映了不可更改值的唯一性。请注意,枚举特性枚举值不能重复,也不能修改。Switchcase可以直接判断对象。冻结()对象。方法可以冻结对象。无法更改实现constEnumSex=Object。冷冻枚举性别。人=1;安慰日志;//符号(男性)表示值constEnumSex=Object的唯一性。freeconsole日志;//错误:当你开始意识到体现价值的独特性时,你会发现男人和女人都是象征(“男性”)。您觉得应该在执行期间报告错误,但没有报告错误。你也怀疑这个符号的独特性。

最近大部分时间再写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的一个描述,为了我们好区分它。

免责声明:文章转载自《js学习-es6实现枚举》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇可爱猫+python——定制化微信机器人ES6学习之对象的遍历下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Protobuf 语言指南(proto3)

Protobuf 语言指南(proto3)Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单。您可以定义数据的结构化,然后可以使用特殊生成的源代码轻松地在各种数据流中使用各种语言编写和读取结构化数据。 定义消息类型 先来看一个非常简单的例子。假设你想定义一个“搜索...

Xcode 报错:duplicate symbols for architecture x86_64错误分析及解决

1、参与编译的.m文件重复导入。一般是手动往工程中导入源文件时导入在了不同的目录。 解决方法也很简单,在 Target -> build parses -> complie sources,去掉重复的文件即可。 2、导入头文件时,误写为导入.m 文件 即 #import xxx.h 写成了 #import xxx.m 解决方法就是,导入头文...

枚举Enum 的常用方法

一、枚举介绍 通常定义常量方法和枚举定义常量方法区别 public class State { public static final int ON = 1; public static final Int OFF= 0; } 第一、它不是类型安全的。 你必须确保是int,其次,你还要确保它的范围是0和1。...

SVG动画

动画原理 SVG动画,就是元素的属性值关于时间的变化。 如下图来说,元素的某个属性值的起始值(from)到结束值(to)在一个时间段(duration)根据时间函数(timing-function)计算出每一帧(frame)的插值(interpolation)作为变换的行为。 PS:SVG动画是帧动画,在SVG里也就是每秒设置多少个value值。 SVG...

深入 js 深拷贝对象

前言 对象是 JS 中基本类型之一,而且和原型链、数组等知识息息相关。不管是面试中,还是实际开发中我们都会碰见深拷贝对象的问题。 顾名思义,深拷贝就是完完整整的将一个对象从内存中拷贝一份出来。所以无论用什么办法,必然绕不开开辟一块新的内存空间。 通常有下面两种方法实现深拷贝: 迭代递归法 序列化反序列化法 我们会基于一个测试用例对常用的实现方法进行...

java枚举类型

public class TestEnum { /*最普通的枚举*/ public enum ColorSelect { red, green, yellow, blue; } /* 枚举也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法,这一切都象你在一般的类中做的那样....