最近大部分時間再寫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的一個描述,為了我們好區分它。