成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用 JavaScript 編寫枚舉的最有效方法

開發 前端
JavaScript 語言本身不支持枚舉。如果我們想模擬枚舉,我們可以使用一個對象。

假設有這樣一個場景,我們需要統計員工的技術棧,目前我們需要標記的技術有 CSS、JavaScript、HTML、WebGL。

然后我可以這樣寫枚舉:

const SKILLS = {
CSS: 1 ,
JS: 2,
HTML: 3,
WEB_GL: 4
}

之前是這樣寫的,但是,最近看vue源碼的時候,發現了一個高效使用枚舉的技巧,在這里分享給大家。

定義枚舉

我們可以這樣寫上面的枚舉:

const SKILLS = {
CSS: 1 ,
JS: 1 << 1,
HTML: 1 << 2,
WEB_GL: 1 << 3
}

<< 是什么?

左移運算符 (<<) 將第一個操作數左移指定位數。向左移動的多余位被丟棄。零位從右側移入。

例如:

  • 二進制的 1 是 0000 0001 ,左移一位是 0000 0010 ,即十進制的 2 。
  • 如果我們將其移動兩位,它將變為 0000 0100 ,即十進制的 4。
  • 如果我們將其移動三位,它將變為 0000 1000 ,即十進制的 8。
  • 如果我們將其移動 N 位,它將變為 2^Nin 十進制。

用法

按照上面的方法定義好枚舉后,我們可以這樣使用:

const SKILLS = {
CSS: 1 ,
JS: 1 << 1,
HTML: 1 << 2,
WEB_GL: 1 << 3
}
// Use this value to store a user's tech-stack
let skills = 0
// add a skill for the user
function addSkill(skill) {
skills = skills | skill
}
addSkill(SKILLS.CSS)
addSkill(SKILLS.JS)
// If this value is not 0, it means that the user has mastered the tech
console.log('Does he know CSS', SKILLS.CSS & skills)
console.log('Does he know JavaScript', SKILLS.JS & skills)
console.log('Does he know Web GL', SKILLS.WEB_GL & skills)

溫馨提示:| 是按位或運算符,它在每個操作數的對應位為 1 的每個位位置返回 1。

cons
t a = 5; // 00000000000000000000000000000101
const b = 3; // 00000000000000000000000000000011
console.log(a | b); // 00000000000000000000000000000111
// expected output: 7

如何理解這段代碼?

在 JavaScript 中,整數存儲在 4 個字節中,即 32 位。第一個代表正負,后面的31代表數字。

當我們用二進制表示 1 , 1 << 2 時,它們看起來像這樣:

我們定義的枚舉變量只有一個二進制格式的1,并且占據不同的位置。

當我們向技能添加枚舉選項時,我們使用skills | skill。假設現在我們需要添加的技能是SKILLS.CSS,那么在執行過程中,就是:

我們可以發現,在技能中,SKILLS.CSS對應的位置會變成1。

反之,那么我們可以通過查看skills&SKILLS.CSS的結果是否為0來判斷技能中是否存在SKILLS.CSS。

順便說一句,這里我們也可以發現這個技巧有個缺點,就是枚舉項不能超過 31 個。

我們為什么要使用這個技巧?

答案很簡單,這樣的代碼運行起來更高效。CPU中有直接對應位操作的指令,因此效率更高。

我們也可以做一個性能測試。

如果我們不使用按位運算,而是使用傳統的方法(數組或映射)來實現,那么代碼如下。

Array 方法:

const SKILLS = {
CSS: 1 ,
JS: 1 << 1,
HTML: 1 << 2,
WEB_GL: 1 << 3
}
// Use an array to store the user's tech-stack
let skills = []
function addSkill(skill) {
if (!skills.includes(skill)) { // Avoid duplicate storage
skills.push(skill)
}
}
addSkill(SKILLS.CSS)
addSkill(SKILLS.JS)
skills.includes(SKILLS.CSS)
skills.includes(SKILLS.JS)
skills.includes(SKILLS.WEB_GL)

Map 方法:

const SKILLS = {
CSS: 1 ,
JS: 1 << 1,
HTML: 1 << 2,
WEB_GL: 1 << 3
}
// Use a map to store the user's tech-stack
let skills = {}
function addSkill(skill) {
if (!skills[skill]) {
skills[skill] = true
}
}
addSkill(SKILLS.CSS)
addSkill(SKILLS.JS)
skills[SKILLS.CSS]
skills[SKILLS.JS]
skills[SKILLS.WEB_GL]

這是 jsbench.me 的性能測試:

使用按位枚舉,性能明顯更高。

學習Vue源碼

我是從 Vue 源代碼中學到的。

export const enum ShapeFlags {
ELEMENT = 1,
FUNCTIONAL_COMPONENT = 1 << 1,
STATEFUL_COMPONENT = 1 << 2,
TEXT_CHILDREN = 1 << 3,
ARRAY_CHILDREN = 1 << 4,
SLOTS_CHILDREN = 1 << 5,
TELEPORT = 1 << 6,
SUSPENSE = 1 << 7,
COMPONENT_SHOULD_KEEP_ALIVE = 1 << 8,
COMPONENT_KEPT_ALIVE = 1 << 9,
COMPONENT = ShapeFlags.STATEFUL_COMPONENT | ShapeFlags.FUNCTIONAL_COMPONENT
}

地址:https://github1s.com/vuejs/core/blob/HEAD/packages/shared/src/shapeFlags.ts

責任編輯:龐桂玉 來源: WEB前端開發社區
相關推薦

2016-11-14 18:02:50

2017-07-12 12:43:42

數據庫SQL

2010-04-21 10:37:02

Oracle創建

2011-05-23 18:17:54

增加外鏈

2017-08-07 09:24:43

云遷移安全方法

2010-05-21 14:11:40

Wi-FiRF管理

2017-08-01 15:33:01

云遷移云安全數據泄露

2017-10-16 13:23:18

手機信息iphone

2023-03-16 08:20:30

數據中心

2011-06-27 13:57:42

JavaScript

2023-01-11 08:51:34

2021-01-27 11:32:12

接口測試代碼

2010-07-01 14:59:51

FreeBSD 8

2013-12-25 11:42:38

2011-11-23 09:06:00

2019-10-18 15:55:52

編程語言PythonJava

2018-08-19 12:50:17

阿里數據庫數據庫備份

2009-06-10 22:11:28

javascript連

2013-05-20 10:43:50

2016-11-30 18:35:03

JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费在线观看h片 | 毛片高清| 久久久久久久电影 | 九九热视频这里只有精品 | 中文字幕 在线观看 | 免费在线观看成人 | 中文字幕在线免费观看 | 欧美一区二区三区在线 | 久草色视频 | 一区二区三区播放 | 亚洲精品欧美一区二区三区 | 91精品国产91久久综合桃花 | 男女羞羞视频在线看 | 国产精品99久久免费观看 | 亚洲 中文 欧美 日韩 在线观看 | 亚洲成人精品 | 欧美一区二不卡视频 | 国产精品日产欧美久久久久 | 久久国产精品一区二区三区 | 午夜精品久久久久久 | 天天影视网天天综合色在线播放 | 欧美精品在线观看 | 国产这里只有精品 | 国产美女永久免费无遮挡 | 成年女人免费v片 | 久久精品综合网 | 男女网站在线观看 | 一级做a爰片久久毛片 | 视频一区二区在线观看 | 一区免费看 | 成人免费视频网址 | 午夜影院在线观看 | 久久久国产一区二区三区四区小说 | 欧美一区二区黄 | 欧美一级电影免费观看 | 91性高湖久久久久久久久_久久99 | 成人免费在线小视频 | 国产精品中文字幕一区二区三区 | 成人做爰69片免费观看 | 欧美日韩国产一区二区三区 | 一区二区在线观看免费视频 |