日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Javascript Symbol原理及使用方法解析

瀏覽:198日期:2023-10-10 13:48:32

Symbol是ES6中新引入的一種基本數(shù)據(jù)類(lèi)型,在此之前JavaScript中已有幾種基本數(shù)據(jù)類(lèi)型:

Numberg String Boolean Null Undefined Object

不同于其他基本類(lèi)型的通俗易懂,Symbol 是什么和有什么用一直有些讓人困惑。

什么是Symbol

JavaScript標(biāo)準(zhǔn)中規(guī)定對(duì)象的key只能是 String 或 Symbol 類(lèi)型,區(qū)別在于 String 類(lèi)型的key可以重復(fù)而 Symbol 類(lèi)型的key是唯一的。Symbol 的本質(zhì)是表示一個(gè)唯一標(biāo)識(shí)。每次創(chuàng)建一個(gè)Symbol,它所代表的值都不可能重復(fù),該值的內(nèi)部實(shí)現(xiàn)可以視為一段數(shù)字(類(lèi)似:3423498431987719455..)。所以理論上 Symbol 的存在只有一個(gè)意義:用于必須使用唯一值的場(chǎng)景。

創(chuàng)建Symbol

創(chuàng)建 Number、String等基本類(lèi)型的實(shí)例有兩種方法:通過(guò)構(gòu)造函數(shù)(或者叫工廠函數(shù))和文字語(yǔ)法糖。比如:

// 構(gòu)造函數(shù)const num = Number(3);const str = String(’hi’);

// 語(yǔ)法糖const num = 3;const str = ’hi’;

顯然使用語(yǔ)法糖更加簡(jiǎn)潔。但是 Symbol 只能通過(guò)構(gòu)造函數(shù) Symbol() 進(jìn)行創(chuàng)建:

const sym = Symbol();

或者,我們可以傳入一個(gè)字符串參數(shù)(descriptor)用于描述該Symbol:

const sym = Symbol(’cat’);

注意:傳入的參數(shù)對(duì) Symbol 值的產(chǎn)生并無(wú)影響,因?yàn)榫退忝看蝹魅氲膮?shù)都一樣,生成的Symbol值也是不等的。該參數(shù)的作用僅用于描述被創(chuàng)建的Symbol,以便debug時(shí)可以識(shí)別出Symbol的含義。 所以,下列等式結(jié)果為 false:

Symbol(’cat’) === Symbol(’cat’) // falseSymbol.for(key)

和 Symbol() 類(lèi)似,Symbol.for(key) 也可以創(chuàng)建一個(gè)Symbol,不一樣的是:創(chuàng)建的 Symbol 是全局的(在全局Symbol表中注冊(cè)),而如果全局已經(jīng)存在相同 key 的Symbol,則直接返回該Symbol。所以,下列等式結(jié)果為 true:

Symbol.for(’cat’) === Symbol.for(’cat’) // true

如何使用Symbol

其實(shí) Symbol 本身很簡(jiǎn)單,但是如何把它用好、且用的恰到好處卻使人困惑,因?yàn)樵谄匠9ぷ髦胁](méi)有多少非Symbol不用的場(chǎng)景。但是用對(duì)了Symbol會(huì)對(duì)你的代碼質(zhì)量有不少提升。來(lái)看下面幾種案例:

1. 用作對(duì)象的key,防止命名沖突

使用Symbol作為Object的key,可以保證和其他key都不重復(fù)。因此,Symbol非常適合用于對(duì)對(duì)象的屬性進(jìn)行拓展。

比如,當(dāng)使用 String 作為對(duì)象的key時(shí),一旦出現(xiàn)重復(fù)的key則后面的屬性會(huì)覆蓋前面的:

const persons = { ’bruce’: ’wayne’, ’bruce’: ’banner’}console.log(persons.bruce); // ’wayne’使用Symbol作為Key可以避免這種情況:const bruce1 = Symbol(’bruce’);const bruce2 = Symbol(’bruce’);const persons = { [bruce1]: ’wayne’, [bruce2]: ’banner’}console.log(persons[bruce1]); // ’wayne’console.log(persons[bruce2]); // ’banner’

js很多內(nèi)建的方法都是通過(guò) Symbol 進(jìn)行指定的,比如:Symobol.iterator 指定了一個(gè)iterable對(duì)象的迭代器方法;Symbol.replace 指定了對(duì)象字符串替換的方法,這類(lèi) Symbol 被稱(chēng)為 Well-know Symbols,代表了js語(yǔ)言的內(nèi)部行為。

2. 使用Symbol定義枚舉

由于Javascript并不自帶枚舉類(lèi)型,通常情況下我們會(huì)使用一個(gè)freezed的Object來(lái)模擬枚舉類(lèi)型,比如定義一個(gè)日期的枚舉:

const DAYS = Object.freeze({monday: 1,tuesday: 2,wednesday: 3});

此時(shí)有一個(gè)方法,接收 DAYS 的枚舉值來(lái)返回當(dāng)天要做的事:

function getTodo(day) { switch (day) { case DAYS.monday: return '看電影'; case DAYS.tuesday: return '購(gòu)物'; case DAYS.wednesday: return '健身'; default: return '日期錯(cuò)誤'; }}

我們希望代碼邏輯足夠嚴(yán)謹(jǐn),傳入的參數(shù)嚴(yán)格按照 DAYS.monday 的形式,否則就返回日期錯(cuò)誤,但是該枚舉類(lèi)型的實(shí)現(xiàn)卻做不到。比如:getTodo(1) 依然能得到 “看電影” 這個(gè)結(jié)果。

但是使用Symbol卻可以解決這一問(wèn)題,DAYS 枚舉類(lèi)型可以重新定義為:

const DAYS = Object.freeze({monday: Symbol(’monday’),tuesday: Symbol(’tuesday’),wednesday: Symbol(’wednesday’)});

此時(shí) getTodo 方法必須接收 DAYS.monday 這樣的枚舉值作為參數(shù),否則就返回 “日期錯(cuò)誤”,因?yàn)槭澜缟显贈(zèng)]有任何一個(gè)值和 DAYS.monday 相等了。

這樣定義枚舉顯然更嚴(yán)謹(jǐn)了。

3. 使用Symbol存儲(chǔ)元數(shù)據(jù)

Key為Symbol類(lèi)型的屬性是不能被枚舉的,這是 Symbol 除了唯一性外的第二大特性,因此使用for...in,Object.keys()、Object.hasOwnProperty()等方法不能識(shí)別Symbol屬性,簡(jiǎn)而言之Symbol屬性對(duì)用戶(hù)是“隱藏”的(但并不是private的,因?yàn)橛衅渌緩娇梢垣@取Symbol屬性),例如:

Javascript Symbol原理及使用方法解析

因此Symbol作為“隱藏”屬性可以用來(lái)存儲(chǔ)對(duì)象的元數(shù)據(jù)。比如,有一個(gè) TodoList:

class TodoList { constructor() { // todo數(shù)量 this.count = 0; } // 增加todo add(id, content) { this[id] = content; this.count++; }}const list = new TodoList();

我們使用 add() 方法向其中增加幾個(gè)todo:

list.add(’a’, ’看電影’);list.add(’b’, ’購(gòu)物’);list.add(’c’, ’健身’);

當(dāng)我們想使用 for...in 查看里面所有的todo時(shí),會(huì)把 count 屬性也帶出來(lái):

Javascript Symbol原理及使用方法解析

為了隱藏count屬性,更方便的對(duì)todo進(jìn)行操作,我們可以使用Symbol來(lái)存儲(chǔ)它,TodoList 類(lèi)修改為:

const count = Symbol(’count’);class TodoList {constructor() {this[count] = 0;}

add(id, content) {this[id] = content;this[count]++;}}

當(dāng)我們?cè)俦闅v TodoList 的時(shí)候,count就隱藏了:

Javascript Symbol原理及使用方法解析

當(dāng)我們想獲取存儲(chǔ)在Symbol中的原數(shù)據(jù)時(shí),可以使用 Object.getOwnPropertySymbols() 方法:

Javascript Symbol原理及使用方法解析

以上是我能想到的 Symbol 的用途,如果大家有其他心得體會(huì)歡迎補(bǔ)充。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
超碰在线99| 免费观看日韩电影| 少妇精品久久久一区二区三区| 欧美日韩精品免费观看视频完整| 久久精品91| 亚洲午夜精品久久久久久app| 日韩成人亚洲| 久久久人人人| 久久影视一区| 亚洲神马久久| 综合亚洲色图| 国产情侣一区| 精品亚洲二区| 久久91导航| 国产高清一区二区| 蜜臀久久99精品久久久久久9| 日韩欧美高清一区二区三区| 日本午夜精品一区二区三区电影 | 99精品在线观看| 国产精品av一区二区| 久久午夜精品一区二区| 日韩成人一级| 久久精品国产一区二区| 日韩一区二区在线免费| 红桃视频国产精品| 婷婷精品在线| 美女久久久久久| 日本欧美不卡| 亚洲精品1区2区| 日韩精品三区四区| 久久精品国产在热久久| 激情综合网址| 日韩超碰人人爽人人做人人添| 美女视频黄免费的久久| 青青青免费在线视频| 国产精品嫩草99av在线| 欧美另类中文字幕| 91视频久久| 天堂成人免费av电影一区| 国产精品hd| 五月天综合网站| 亚洲精品欧洲| jizzjizz中国精品麻豆| 精品中文字幕一区二区三区av| 日本一区二区中文字幕| 亚洲黄色中文字幕| 亚洲欧洲免费| 狠狠躁少妇一区二区三区| 久久亚洲不卡| caoporn视频在线| 日韩在线视频一区二区三区| 精精国产xxxx视频在线野外| 日韩美女国产精品| 在线人成日本视频| 日韩一区二区三免费高清在线观看 | 亚洲综合福利| 国产成人精品福利| 蘑菇福利视频一区播放| 麻豆国产精品视频| 午夜亚洲精品| 国精品产品一区| 日韩制服丝袜av| 成人在线免费观看网站| 亚洲在线国产日韩欧美| 久久精品一本| 亚洲涩涩av| 亚洲成人精品| 欧美国产视频| 亚洲免费观看高清完整版在线观| 日韩不卡免费高清视频| 国产精品片aa在线观看| 国产精品婷婷| 久久久久免费| 欧美视频一区| 亚洲一区二区三区高清| 韩国女主播一区二区三区| 亚洲三级视频| 91精品久久久久久久久久不卡| 婷婷综合电影| 欧美日韩国产高清电影| 久久久久久亚洲精品美女| 蜜臀91精品一区二区三区| 国产成人精品一区二区三区视频| 日韩欧美三区| 视频一区在线视频| 亚洲一本视频| 美女福利一区二区三区| 国产福利一区二区精品秒拍| 综合亚洲视频| 亚洲在线电影| 亚洲天堂久久| 老牛影视精品| 精品国产网站| 国产欧美三级| 一区二区亚洲视频| 伊人久久亚洲热| 久久视频精品| 色婷婷狠狠五月综合天色拍| 丰满少妇一区| 久久不卡日韩美女| 国产午夜久久av| 日韩高清一区二区| 日本亚洲最大的色成网站www| 视频一区欧美精品| 女人天堂亚洲aⅴ在线观看| 亚洲www免费| 国产日韩电影| 国产伊人久久| 久久亚洲黄色| 乱一区二区av| 麻豆91精品91久久久的内涵| 国产精品九九| 国产激情一区| 欧美激情久久久久久久久久久| 日本午夜精品久久久久| 日日夜夜免费精品视频| 亚洲va久久| 日韩高清一区| 日韩国产欧美在线播放| 日韩高清在线观看一区二区| 日韩精品一级| 奇米狠狠一区二区三区| 欧美视频一区| 久久激情av| 国产精品久av福利在线观看| 嫩草伊人久久精品少妇av杨幂 | 亚洲成人国产| 欧美精选一区二区三区| 狠狠色狠狠色综合日日tαg| 欧美精品黄色| 老鸭窝毛片一区二区三区| 欧美专区18| 综合亚洲自拍| 国产亚洲精品美女久久| 国产美女精品视频免费播放软件| 国产欧美一区二区三区精品观看 | 蜜桃精品在线| 2023国产精品久久久精品双 | 欧美影院三区| 好看不卡的中文字幕| 亚洲视频电影在线| 日韩超碰人人爽人人做人人添| 91精品啪在线观看国产爱臀| 18国产精品| 欧美精品导航| 日韩久久一区二区三区| 亚洲福利免费| 婷婷六月综合| 色8久久久久| 久久麻豆视频| 激情综合五月| 欧美日韩水蜜桃| 久久亚洲影院| 91国内精品| 色偷偷色偷偷色偷偷在线视频| 国产综合亚洲精品一区二| 美女国产一区| 日本一区中文字幕| 精品午夜视频| 午夜久久美女| 欧美日韩一区二区三区不卡视频 | 国产精品美女午夜爽爽| 精品一区二区三区中文字幕视频 | 精品日产乱码久久久久久仙踪林| 欧美国产美女| 9国产精品视频| 日韩综合一区二区| 精品在线网站观看| 黄色成人在线网址| 91亚洲精品在看在线观看高清| 国产一区二区三区探花| 亚洲激情国产| 老司机精品视频在线播放| 婷婷亚洲五月| 欧美韩一区二区| 自由日本语亚洲人高潮| 国产探花在线精品| 999久久久精品国产| 日本不卡不码高清免费观看| 久久精品国产99国产| 欧美日韩免费观看一区=区三区| 91成人福利| 99精品电影| 欧美在线精品一区| 久久久精品网| 欧美片网站免费| 亚洲伦乱视频| 日韩精品亚洲专区在线观看| 日韩视频网站在线观看| 亚洲18在线| se01亚洲视频| 国产三级一区| 91久久在线| 高清日韩中文字幕| 美女日韩在线中文字幕| 中文字幕在线视频网站| 日本久久一区| 日韩亚洲国产欧美| 国产盗摄——sm在线视频| 日韩动漫一区|