es6之Symbol數(shù)據(jù)類型

Symbol(符號(hào))

一. 概念

是一種新的數(shù)據(jù)類型悟泵,值之間互不等

<html>
<span style='color:red'>注:Symbol為生產(chǎn)Symbol類型數(shù)據(jù)的函數(shù),而不是數(shù)據(jù)類型本身</span>
</html>

值類型而非引用類型

    var a = new Symbol()  //  throw err
    
    var b = Symbol()
    typeof b   // symbol

只可通過Object.getOwnPropertySymbols獲取

for in冬筒、for of、Object.keys()从祝、Object.getOwnPropertyNames()续语、無法遍歷出symbol屬性

var a = Symbol()
var b = {}

b[a] = "hehe"

Object.keys(b)  // []垂谢,數(shù)組為空

Object.getOwnPropertySymbols() // [ Symbol() ]

<html>
<span style='color:red'>注:所有引用類型數(shù)據(jù)都是通過new操作符產(chǎn)生的,因此使用new操作符報(bào)錯(cuò)可證明其數(shù)據(jù)類型為值類型</span>
</html>

二. 語法

1. 使用Symbol函數(shù)生成Symbol類型值

    // 局部Symbol
    var a = Symbol()  
    var b = Symbol('symbol')
    var c = Symbol('symbol')
        
    a === b     // false
    b === c     // false
    c === a     // false

2. 注冊(cè)全局可重用Symbol

    // 全局Symbol
    
    // 全局注冊(cè)key1與key2
    var key1 = Symbol.for('key1')
    var key2 = Symbol.for('key2')
    
    key1 === key2 // false
    
    // 從全局獲取key2鍵對(duì)應(yīng)的Symbol
    var tempKey2 = Symbol.for('key2')
    
    key2 === tempKey2  // true
    
    // 通過Symbol獲取全局表中對(duì)應(yīng)的key
    console.log(Symbol.keyFor(key2))  // key2

三. 用途

1. 防沖突

  • 第三方庫的命名沖突
  • 狀態(tài)管理中狀態(tài)沖突
  • 與標(biāo)準(zhǔn)api沖突

2. 枚舉

四. 內(nèi)置Symbol

symbol內(nèi)置在了許多對(duì)象中作為屬性名稱,會(huì)在特定情況下觸發(fā)

描述 含義
Symbol.iterator 用于為對(duì)象定義一個(gè)方法并返回一個(gè)屬于所對(duì)應(yīng)對(duì)象的迭代器疮茄,該迭代器會(huì)被for-of循環(huán)語句所使用
Symbol.hasInstance 用于為類定義一個(gè)方法滥朱,該方法會(huì)因?yàn)閕nstanceof語句的使用而被調(diào)用根暑,來檢查一個(gè)對(duì)西那個(gè)是否是某一個(gè)類的實(shí)例
Symbol.match 用于為正則表達(dá)式定義一個(gè)可被String.prototype.match方法使用的方法,檢查對(duì)應(yīng)的字符串與當(dāng)前正則表達(dá)式是否匹配
Symbol.replace 用于為正則表達(dá)式或?qū)ο蠖x一個(gè)方法徙邻。該方法會(huì)因?yàn)镾tring.prototype.replace方法的使用而被調(diào)用排嫌,用于處理當(dāng)字符串使用該正則表達(dá)式或?qū)ο笞鳛樘鎿Q標(biāo)志時(shí)的內(nèi)部處理邏輯
Symbol.search 用于為正則表達(dá)式或?qū)ο蠖x一個(gè)方法。該方法會(huì)因?yàn)镾tring.prototype.replace方法的使用而被調(diào)用缰犁,用于處理當(dāng)字符串使用該正則表達(dá)式或?qū)ο笞鳛槲恢盟饕龢?biāo)志時(shí)的內(nèi)部處理邏輯
Symbol.split 用于為正則表達(dá)式或?qū)ο蠖x一個(gè)方法淳地。該方法會(huì)因?yàn)镾tring.prototype.replace方法的使用而被調(diào)用,用于處理當(dāng)字符串使用該正則表達(dá)式或?qū)ο笞鳛榉指顦?biāo)志時(shí)的內(nèi)部處理邏輯
Symbol.unscopables 用于為對(duì)象定義一個(gè)屬性帅容。該屬性用于決定該對(duì)象中哪些屬性是可以被with語句所使用的
Symbol.isConcatSpreadable 用于對(duì)對(duì)西那個(gè)定義一個(gè)屬性薇芝。該屬性用于決定該對(duì)西那個(gè)作為Array.prototype.concat()方法的參數(shù)時(shí),是否會(huì)被展開
Symbol.species 用于為類定義定義一個(gè)靜態(tài)屬性丰嘉。該屬性用于決定該類的默認(rèn)構(gòu)建函數(shù)
Symbol.toPrimitive 用于為對(duì)象定義一個(gè)方法夯到。該方法會(huì)在該對(duì)象需要轉(zhuǎn)換為值類型的時(shí)候被調(diào)用,可以根據(jù)程序的行為決定該對(duì)象需要被轉(zhuǎn)換成的值
Symbol.toStringTag 用于為類定義一個(gè)屬性饮亏。該屬性可以決定這個(gè)類的實(shí)例在調(diào)用toString方法時(shí)耍贾,其中的標(biāo)簽內(nèi)容

1. Symbol.iterator

es6標(biāo)準(zhǔn)定義了可迭代對(duì)象和新的for-of循環(huán)語句,其中可迭代對(duì)象不是一種類型路幸,而是帶有@@iterator屬性和可以被for-of循環(huán)語句所遍歷的對(duì)象統(tǒng)稱荐开。
定義一個(gè)可迭代對(duì)象

可迭代對(duì)象都會(huì)使用Symbol.iterator作為方法名的方法屬性,該方法會(huì)返回一個(gè)迭代器

/**
* 迭代器是一個(gè)含有next方法的對(duì)象
* next方法返回一個(gè)迭代狀態(tài)對(duì)象简肴,含有value與done值
* 最后一次返回狀態(tài)值為undefined
/
let obj = {
    [Symbol.iterator]() {
        return {
            next() {
                return {
                    value: 'value',
                    done: false,
                }
            }
        }
    }
}

2. Symbol.hasInstance

對(duì)象的Symbol.hasInstance屬性晃听,指向一個(gè)內(nèi)部方法。當(dāng)其他對(duì)象使用instanceof運(yùn)算符砰识,判斷是否為該對(duì)象的實(shí)例時(shí)能扒,會(huì)調(diào)用這個(gè)方法

3. Symbol.match

對(duì)象的Symbol.match屬性,指向一個(gè)函數(shù)辫狼。當(dāng)執(zhí)行str.match(myObject)時(shí)初斑,如果該屬性存在,會(huì)調(diào)用它膨处,返回該方法的返回值见秤。

四. 總結(jié)

1. Symbol數(shù)據(jù)類型唯一性

2. js為symbol提供了局部與全局兩種作用域

3. js內(nèi)部使用Symbol標(biāo)記了許多獨(dú)特的功能函數(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市真椿,隨后出現(xiàn)的幾起案子鹃答,更是在濱河造成了極大的恐慌,老刑警劉巖突硝,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件测摔,死亡現(xiàn)場離奇詭異,居然都是意外死亡狞换,警方通過查閱死者的電腦和手機(jī)避咆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門舟肉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來修噪,“玉大人查库,你說我怎么就攤上這事』魄恚” “怎么了樊销?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脏款。 經(jīng)常有香客問我围苫,道長,這世上最難降的妖魔是什么撤师? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任剂府,我火速辦了婚禮,結(jié)果婚禮上剃盾,老公的妹妹穿的比我還像新娘腺占。我一直安慰自己,他們只是感情好痒谴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布衰伯。 她就那樣靜靜地躺著,像睡著了一般积蔚。 火紅的嫁衣襯著肌膚如雪意鲸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天尽爆,我揣著相機(jī)與錄音怎顾,去河邊找鬼。 笑死漱贱,一個(gè)胖子當(dāng)著我的面吹牛杆勇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饱亿,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼蚜退,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了彪笼?” 一聲冷哼從身側(cè)響起钻注,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎配猫,沒想到半個(gè)月后幅恋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泵肄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年捆交,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淑翼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡品追,死狀恐怖玄括,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肉瓦,我是刑警寧澤遭京,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站泞莉,受9級(jí)特大地震影響哪雕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鲫趁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一斯嚎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挨厚,春花似錦堡僻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慌申,卻和暖如春陌选,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹄溉。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工咨油, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柒爵。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓役电,卻偏偏與公主長得像,于是被迫代替她去往敵國和親棉胀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子法瑟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 1.概述 ES5的對(duì)象屬性名都是字符串,這容易造成屬性名的沖突唁奢。比如霎挟,你使用了一個(gè)他人提供的對(duì)象,但又想為這個(gè)對(duì)象...
    趙然228閱讀 808評(píng)論 2 10
  • 第一章:塊級(jí)作用域綁定 塊級(jí)聲明 1.var聲明及變量提升機(jī)制:在函數(shù)作用域或者全局作用域中通過關(guān)鍵字var聲明的...
    BeADre_wang閱讀 831評(píng)論 0 0
  • 一、概述在ES5中,對(duì)象屬性名都是字符串容易造成屬性名沖突熬北。為了避免這種情況的發(fā)生疙描,ES6引入了一種新的原始數(shù)據(jù)類...
    貴在隨心閱讀 14,576評(píng)論 0 8
  • (2015-11-25-Wed 17:03:32) 當(dāng)焦點(diǎn)聚焦于想法時(shí),可當(dāng)作激活想法處理讶隐。 一種鍵盤使用的方式起胰。...
    菜五閱讀 120評(píng)論 0 1
  • 兩個(gè)人的相愛 是為了彼此變得更好 于是相互陪伴著 走過了最好的年紀(jì) 即便最后不是你 路過了你的好 我依舊幸福
    獲月白閱讀 106評(píng)論 0 2