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的一個描述,為了我們好區分它。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM