javascript symbol

根據(jù)規(guī)范晾蜘,對象的屬性鍵只能是字符串類型或者 Symbol 類型,到目前為止仗考,我們只見過字符串。現(xiàn)在我們來看看 Symbol 能給我們帶來什么好處词爬。

1秃嗜、symbol值表示唯一的標(biāo)識符,即使創(chuàng)建了許多具有相同描述的symbol顿膨,它們的值也不相同锅锨,描述只是一個(gè)標(biāo)簽,不影響任何東西

let id1 = Symbol("id")

let id2 = Symbol("id")

alert(id1==id2) // false

2恋沃、symbol不會(huì)被自動(dòng)轉(zhuǎn)換為字符串

let id = Symbol("id")

alert(id) //?Cannot convert a Symbol value to a string

這是一種防止混亂的“語言保護(hù)”必搞,因?yàn)樽址?Symbol 有本質(zhì)上的不同,不應(yīng)該意外地將它們轉(zhuǎn)換成另一個(gè)芽唇。

let id = Symbol("id")

alert(id.toString())? //?Symbol(id)

或者獲取?symbol.description?屬性,只顯示描述(description):

let id = Symbol("id")

alert(id.description) // id

3、隱藏屬性

Symbol 允許我們創(chuàng)建對象的“隱藏”屬性匆笤,代碼的任何其他部分都不能意外訪問或重寫這些屬性研侣。

let?user?=?{?//?屬于另一個(gè)代碼

????name:?"John",

????id:?'7777777777'

??};

??let?id?=?Symbol("id");

??user[id]?=?1;

??console.log(user) //?{name: "John", id: '7777777777', Symbol(id): 1}

? console.log(user[id]) // 1?

? console.log(user.id) //?7777777777

使用?Symbol("id")?作為鍵,比起用字符串?"id"?來有什么好處呢炮捧?

因?yàn)?user?對象屬于其他的代碼庶诡,那些代碼也會(huì)使用這個(gè)對象,所以我們不應(yīng)該在它上面直接添加任何字段咆课,這樣很不安全末誓。但是你添加的 Symbol 屬性不會(huì)被意外訪問到,第三方代碼根本不會(huì)看到它书蚪,所以使用 Symbol 基本上不會(huì)有問題喇澡。

另外,假設(shè)另一個(gè)腳本希望在?user?中有自己的標(biāo)識符殊校,以實(shí)現(xiàn)自己的目的晴玖。這可能是另一個(gè) JavaScript 庫,因此腳本之間完全不了解彼此为流。

然后該腳本可以創(chuàng)建自己的?Symbol("id")

我們的標(biāo)識符和它們的標(biāo)識符之間不會(huì)有沖突呕屎,因?yàn)?Symbol 總是不同的,即使它們有相同的名字敬察。

……但如果我們處于同樣的目的秀睛,使用字符串?"id"?而不是用 symbol,那么?就會(huì)?出現(xiàn)沖突

4莲祸、對象字面量中的Symbol蹂安,如果我們要在對象字面量?{...}?中使用 Symbol,則需要使用方括號把它括起來虫给。

let id = Symbol("id")

let user = { name: "John",[id]:123}

5藤抡、Symbol 屬性不參與?for..in?循環(huán)

Object.keys(user)?也會(huì)忽略它們。這是一般“隱藏符號屬性”原則的一部分抹估。如果另一個(gè)腳本或庫遍歷我們的對象缠黍,它不會(huì)意外地訪問到符號屬性。

相反药蜻,Object.assign?會(huì)同時(shí)復(fù)制字符串和 symbol 屬性:

let id = Symbol("id")

let user = { [id]: 123}

let clone = Object.assign({}, user)

alert( clone[id] ); // 123

6瓷式、全局Symbol

// 從全局注冊表中讀取

let id = Symbol.for("id")// 如果該 Symbol 不存在,則創(chuàng)建它

// 再次讀扔镌蟆(可能是在代碼中的另一個(gè)位置)

let idAgain = Symbol.for("id") // 相同的?

Symbolalert( id === idAgain ); // true

注冊表內(nèi)的 Symbol 被稱為?全局 Symbol贸典。如果我們想要一個(gè)應(yīng)用程序范圍內(nèi)的 Symbol,可以在代碼中隨處訪問 —— 這就是它們的用途踱卵。

7廊驼、Symbol.keyFor

對于全局 Symbol据过,不僅有?Symbol.for(key)?按名字返回一個(gè) Symbol,還有一個(gè)反向調(diào)用:Symbol.keyFor(sym)妒挎,它的作用完全反過來:通過全局 Symbol 返回一個(gè)名字绳锅。

// 通過 name 獲取 Symbol

let sym = Symbol.for("name")

let sym2 = Symbol.for("id") // 通過 Symbol 獲取 name

alert( Symbol.keyFor(sym) ); // name

alert( Symbol.keyFor(sym2) ); // id

Symbol.keyFor?內(nèi)部使用全局 Symbol 注冊表來查找 Symbol 的鍵。所以它不適用于非全局 Symbol酝掩。如果 Symbol 不是全局的鳞芙,它將無法找到它并返回?undefined。

也就是說期虾,任何 Symbol 都具有?description?屬性原朝。

let globalSymbol = Symbol.for("name");

let localSymbol = Symbol("name");

alert( Symbol.keyFor(globalSymbol) ); // name,全局 Symbol

alert( Symbol.keyFor(localSymbol) ); // undefined镶苞,非全局

alert( localSymbol.description ); // name

8浊竟、系統(tǒng)Symbol

JavaScript 使用了許多系統(tǒng) Symbol撰筷,這些 Symbol 可以作為?Symbol.*?訪問魔慷。我們可以使用它們來改變一些內(nèi)置行為雹舀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市煌贴,隨后出現(xiàn)的幾起案子御板,更是在濱河造成了極大的恐慌,老刑警劉巖牛郑,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怠肋,死亡現(xiàn)場離奇詭異,居然都是意外死亡淹朋,警方通過查閱死者的電腦和手機(jī)笙各,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來础芍,“玉大人杈抢,你說我怎么就攤上這事÷匦裕” “怎么了惶楼?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诊杆。 經(jīng)常有香客問我歼捐,道長,這世上最難降的妖魔是什么晨汹? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任豹储,我火速辦了婚禮,結(jié)果婚禮上淘这,老公的妹妹穿的比我還像新娘剥扣。我一直安慰自己巩剖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布钠怯。 她就那樣靜靜地躺著球及,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呻疹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天筹陵,我揣著相機(jī)與錄音刽锤,去河邊找鬼。 笑死朦佩,一個(gè)胖子當(dāng)著我的面吹牛并思,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播语稠,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼宋彼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仙畦?” 一聲冷哼從身側(cè)響起输涕,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎慨畸,沒想到半個(gè)月后莱坎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寸士,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年檐什,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弱卡。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乃正,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婶博,到底是詐尸還是另有隱情瓮具,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布凡蜻,位于F島的核電站搭综,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏划栓。R本人自食惡果不足惜兑巾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忠荞。 院中可真熱鬧蒋歌,春花似錦帅掘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至府框,卻和暖如春吱窝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迫靖。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工院峡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人系宜。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓照激,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盹牧。 傳聞我的和親對象是個(gè)殘疾皇子俩垃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容