ES6 - Symbol

概述

ES5中的對(duì)象屬性名都是字符串迎吵,如果我們使用了一個(gè)他人提供的對(duì)象,又需要為該對(duì)象添加新的方法(mixin模式),新的方法可能會(huì)與現(xiàn)有的方法產(chǎn)生沖突鹤树,ES6引入了新的數(shù)據(jù)類型Symbol來(lái)保證每個(gè)屬性的名字是獨(dú)一無(wú)二的。

至此逊朽,JavaScript共有七種數(shù)據(jù)類型:undefined罕伯、null、布爾值(Boolean)叽讳、字符串(String)追他、數(shù)值(Number)、對(duì)象(Object)岛蚤、Symbol邑狸。Symbol的值是通過(guò)Symbol函數(shù)生成的,不能使用new灭美。

let s = Symbol('foo');

typeof s // "symbol"
s1.toString() // "Symbol(foo)"

let s1 = Symbol('foo');

s === s1 // false

作為屬性名的Symbol

let a1 = Symbol.for('abc');
  let obj = {
    [a1]: '123',
    'abc': 345,
    'c': 456
  };
  console.log('obj', obj);

Symbol的值作為對(duì)象屬性名時(shí)推溃,不能使用點(diǎn)運(yùn)算符。此時(shí)届腐,該屬性是公開(kāi)屬性铁坎,不是私有屬性。

Symbol類型還可以定義一組常量犁苏,保證這組常量的值都是不相等的硬萍。

const COLOR_RED    = Symbol();
const COLOR_GREEN  = Symbol();

function getComplement(color) {
  switch (color) {
    case COLOR_RED:
      return COLOR_GREEN;
    case COLOR_GREEN:
      return COLOR_RED;
    default:
      throw new Error('Undefined color');
    }
}

屬性名的遍歷

Symbol作為屬性名,不會(huì)被for...in围详、for...of遍歷朴乖,也不會(huì)被Object.keys()祖屏、Ojbect.getOwnPropertyNames()JSON.stringify()返回买羞。

它可以通過(guò)Object.getOwnPropertySymbols()遍歷袁勺,該方法趕回一個(gè)數(shù)組,也可以通過(guò)Reflect.ownKeys方法遍歷:

let a1 = Symbol.for('abc');
  let obj = {
    [a1]: '123',
    'abc': 345,
    'c': 456
  };
  console.log('obj', obj);

  for (let [key, value] of Object.entries(obj)) {
    console.log('let of', key, value);
  }

  Object.getOwnPropertySymbols(obj).forEach((item) => console.log(obj[item]));

  Reflect.ownKeys(obj).forEach((item) => console.log('ownkeys', item, obj[item]));

Symbol.for(), Symbol.keyFor()

通過(guò)Symbol.for方法可以重新使用同一個(gè)Symbol值畜普,它的參數(shù)是一個(gè)字符串期丰,然后搜索是否有以該參數(shù)作為名稱的Symbol值。如果有吃挑,就返回這個(gè)Symbol值钝荡,否則會(huì)新建并返回一個(gè)以該字符串為名稱的Symbol值。

let s1 = Symbol.for('foo');
let s2 = Symbol.for('foo');

s1 === s2 // true

Symbol.keyFor方法返回一個(gè)已登記的Symbol類型值的key舶衬。

let s1 = Symbol.for('foo');
Symbol.keyFor(s1) // "foo"

let s2 = Symbol('foo');
Symbol.keyFor(s2) // undefined

內(nèi)置的Symbol值

ES6提供了11個(gè)內(nèi)置的Symbol值埠通,指向語(yǔ)言內(nèi)部的使用方法。

  • Symbol.hasInstance

  • Symbol.isConcatSpreadable

  • Symbol.species

  • Symbol.match

  • Symbol.replace

  • Symbol.search

  • Symbol.split

  • Symbol.iterator

    對(duì)象進(jìn)行for...of循環(huán)時(shí)逛犹,會(huì)調(diào)用此方法端辱。

  • Symbol.toPrimitive

  • Symbol.toStringTag

  • Symbol.unscopables

具體使用方法和介紹可以參考阮一峰老師的教程 內(nèi)置的Symbol值

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末圾浅,一起剝皮案震驚了整個(gè)濱河市掠手,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌狸捕,老刑警劉巖喷鸽,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異灸拍,居然都是意外死亡做祝,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門鸡岗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)混槐,“玉大人,你說(shuō)我怎么就攤上這事轩性∩牵” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵揣苏,是天一觀的道長(zhǎng)悯嗓。 經(jīng)常有香客問(wèn)我,道長(zhǎng)卸察,這世上最難降的妖魔是什么脯厨? 我笑而不...
    開(kāi)封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮坑质,結(jié)果婚禮上合武,老公的妹妹穿的比我還像新娘临梗。我一直安慰自己,他們只是感情好稼跳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布盟庞。 她就那樣靜靜地躺著,像睡著了一般岂贩。 火紅的嫁衣襯著肌膚如雪茫经。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天萎津,我揣著相機(jī)與錄音,去河邊找鬼抹镊。 笑死锉屈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垮耳。 我是一名探鬼主播颈渊,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼终佛!你這毒婦竟也來(lái)了俊嗽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铃彰,失蹤者是張志新(化名)和其女友劉穎绍豁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牙捉,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡竹揍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邪铲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芬位。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖带到,靈堂內(nèi)的尸體忽然破棺而出昧碉,到底是詐尸還是另有隱情,我是刑警寧澤揽惹,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布被饿,位于F島的核電站,受9級(jí)特大地震影響永丝,放射性物質(zhì)發(fā)生泄漏锹漱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一慕嚷、第九天 我趴在偏房一處隱蔽的房頂上張望哥牍。 院中可真熱鬧毕泌,春花似錦、人聲如沸嗅辣。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)澡谭。三九已至愿题,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛙奖,已是汗流浹背潘酗。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雁仲,地道東北人仔夺。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像攒砖,于是被迫代替她去往敵國(guó)和親缸兔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 1.概述 ES5的對(duì)象屬性名都是字符串吹艇,這容易造成屬性名的沖突惰蜜。比如,你使用了一個(gè)他人提供的對(duì)象受神,但又想為這個(gè)對(duì)象...
    趙然228閱讀 808評(píng)論 2 10
  • Symbol:一種新的原始數(shù)據(jù)類型抛猖,表示獨(dú)一無(wú)二的值。 引入Symbol的原因:ES5 的對(duì)象屬性名都是字符串路克,這...
    Rose_yang閱讀 307評(píng)論 0 0
  • 1.概括 ES5 的對(duì)象屬性名都是字符串樟结,這容易造成屬性名的沖突。比如精算,你使用了一個(gè)他人提供的對(duì)象瓢宦,但又想為這個(gè)對(duì)...
    不去解釋閱讀 522評(píng)論 0 1
  • Statistical Shape Models (SSMs) The shape of an object is...
    ogdg閱讀 510評(píng)論 0 0
  • 三原則:圖原創(chuàng),文原創(chuàng)灰羽,詩(shī)原創(chuàng)驮履。 我問(wèn)清風(fēng)你在哪里 風(fēng)不語(yǔ) 我知她在嫉妒你 我問(wèn)彩云你在哪里 云不語(yǔ) 我知她在羨慕...
    秋水飲馬閱讀 878評(píng)論 57 56