ES6新增數(shù)據(jù)類型

symbol

ES6 增加了一個新的基本數(shù)據(jù)類型 symbol. 不過,和其他基本數(shù)據(jù)類型相比,它有點與眾不同,因為它沒有字面量的表現(xiàn)形式噪漾,而且創(chuàng)建的方式也有點奇怪,只能通過調用全局函數(shù)Symbol()來完成且蓬。
let firstSymbol = Symbol();

這里注意一點欣硼,Symbol函數(shù)調用的時候,前面不要加new. 創(chuàng)建了一個symbol, 它有什么作用呢恶阴? 可以把它看作一個類字符串诈胜,和字符串的使用方式一致,字符串能用的地方冯事,symbol 基本都能用焦匈,最常用的地方就是作為對象的屬性名使用,因為桅咆,symbol創(chuàng)建的起因是一項對象的私有屬性的提議括授,落實到規(guī)范中,私有屬性去除掉了岩饼,對象的屬性保留下來了

let firstSymbol = Symbol();

let person = {
    [firstSymbol]: 'symbolName'
}

let dog = {};
dog[firstSymbol] = "sybolName"

symbol 是唯一的荚虚,它和任何其他symbol 都不相等,避免了屬性名的沖突籍茧。

let firstSymbol = Symbol();
let secondSymbol = Symbol();
console.log(firstSymbol == secondSymbol) // false

這么調用Symbol() 函數(shù)也有問題版述,就是程序出問題, 進行debugger 的時候寞冯,不是很容易找到哪個symbol 出現(xiàn)的問題渴析,所以Symbol 函數(shù)可以接受一個字符串, 對這個symbol 進行描述吮龄。

let firstSymbol = Symbol('first symbol');
let secondSymbol = Symbol('second symbol');
console.log(secondSymbol) //Symbol(second symbol)

symbol的描述存在于每一個symbol 的內(nèi)部屬性 [[Description]] 中俭茧,外部是無法獲取的,不過漓帚,可以通過顯示或隱式調用toString() 方法來獲取母债, console.log 就是通過隱式調用toString 方法來獲取描述的。

但是有時候,你不想要這種唯一性毡们, 可能所有的對象都共用一個symbol 屬性迅皇, 這怎么辦? 在一個文件js中衙熔,很好處理登颓,所有的對象都使用這一個symbol 變量就可以了,但跨文件就不好處理了红氯,尤其是提倡模塊化的今天框咙,每一個文件都是一個模塊,都有自己的私有作用域脖隶。在這種情況下扁耐,就要使用共享symbol 了,創(chuàng)建symbol 變量的時候产阱,使用Symbol.for() 方法婉称,參數(shù)是一個字符串, 可以理解為共享標識key,

let uid = Symbol.for('uid');

當我們使用Symbol.for() 創(chuàng)建symbol 的時候构蹬,js 引擎就會向全局symbol 注冊中心去查找這個symbol, 查找的依據(jù)是唯一的標識key(在這里是‘’uid‘’)王暗, 如果找到了,就直接返回庄敛,如果沒有找到俗壹,就創(chuàng)建一個新的symbol,并使用唯一的標識key注冊到全局注冊中心藻烤,然后返回它绷雏, 這樣,我們以后再使用這個key 創(chuàng)建 symbol, 就會獲取到同一個symbol, 這就共享了怖亭。舉個例子驗證一下

let uid1 = Symbol.for('uid');
let uid2 = Symbol.for('uid');

console.log(uid1 === uid2); // true

還有一個Symbol.keyFor() 方法涎显,可以獲取到一個symbol 在全局注冊中心中注冊的唯一標識key。

let uid1 = Symbol.for('uid');
let symbolKey = Symbol.keyFor(uid1);
console.log(symbolKey)  // 'uid'

如果一個對象中有多個symbol 屬性兴猩,是不是可以一次性地獲取到期吓? 你可能想到了Object.keys() 方法,但是它對symbol 不起作用倾芝,為了獲取到symbol 屬性讨勤,js 專門定義了一個方法,Object.getOwnPropertySymbols(), 它返回一個包含所有symbol 屬性地數(shù)組晨另。

let uid = Symbol.for("uid");
let object = {
    [uid]: "12345"
};
let symbols = Object.getOwnPropertySymbols(object);
console.log(symbols.length); // 1
console.log(symbols[0]); // "Symbol(uid)"
console.log(object[symbols[0]]); // "12345"

當然潭千,如果僅僅是為了給對象簡單地添加屬性,就增加一個symbol 類型和Symbol() 函數(shù)借尿,那就有點大才小用了刨晴。添加Symbol 還要一個很大的作用,就是暴露js的一些內(nèi)部方法(Exposing Internal Operations), 為此, js 定義了一些有名的symbol (well-known symbols)割捅, 這些symbols 都是增加到Symbol 對象上。

Symbol.hasInstance

每一個函數(shù)都有一個Symbol.hasInstance方法帚桩,主要是判斷一個對象是不是一個函數(shù)的實例亿驾,就是平常我們使用的instanceOf 方法. obj instanceOf Array, 實際上就是調用Array 函數(shù)上面的Symbol.hasInstance 方法账嚎,Array [ Symbol.hasInstance] (obj), 可以發(fā)現(xiàn)莫瞬,Symbol.hasInstance 方法 接受一個參數(shù)就是我們要檢查的對象,然后返回true or false, 來表示檢查的對象是不是函數(shù)的實例郭蕉, true 就表示是疼邀,false 表示不是。寫一個簡單的例子體驗一下
 首先必須有一個函數(shù)召锈, 那就聲明一個函數(shù)Person

function Person(name) {
    this.name = name;
}

現(xiàn)在使用instanceOf 方法驗證一下

console.log(new Person('sam') instanceof Person);

你會發(fā)現(xiàn)旁振,返回true, 但是 我們明明返回的是false, 是哪個地方出問題了? 這是因為每一個函數(shù)都有一個默認的Symbol.hasInstance, 它位于函數(shù)的原型鏈Function.prototype 上涨岁, 我們在Person 函數(shù)上定義Symbol.hasInstance方法是相當于遮蔽原型鏈上的方法拐袜,但是在原型鏈上定義的Symbol.hasInstance 方法,它是不可配置梢薪,不可改寫蹬铺,不可迭代的。正是由于不可改寫秉撇,像Person[Symbol.hasInstance] 普通賦值的方式無法真正實現(xiàn)賦值甜攀,靜默失敗。那怎么才能遮蔽原型鏈上Symbol.hasInstance 方法琐馆, 使用Object.defineProperty 方式進行賦值

Object.defineProperty(Person, Symbol.hasInstance, {
    value: function(value) {
        return false;
    }
})

這時候 console.log 就返回false了规阀。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市啡捶,隨后出現(xiàn)的幾起案子姥敛,更是在濱河造成了極大的恐慌,老刑警劉巖瞎暑,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彤敛,死亡現(xiàn)場離奇詭異,居然都是意外死亡了赌,警方通過查閱死者的電腦和手機墨榄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勿她,“玉大人袄秩,你說我怎么就攤上這事。” “怎么了之剧?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵郭卫,是天一觀的道長。 經(jīng)常有香客問我背稼,道長贰军,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任蟹肘,我火速辦了婚禮词疼,結果婚禮上,老公的妹妹穿的比我還像新娘帘腹。我一直安慰自己贰盗,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布阳欲。 她就那樣靜靜地躺著舵盈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪球化。 梳的紋絲不亂的頭發(fā)上书释,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音赊窥,去河邊找鬼爆惧。 笑死,一個胖子當著我的面吹牛锨能,可吹牛的內(nèi)容都是我干的扯再。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼址遇,長吁一口氣:“原來是場噩夢啊……” “哼熄阻!你這毒婦竟也來了?” 一聲冷哼從身側響起倔约,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤秃殉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浸剩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钾军,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年绢要,在試婚紗的時候發(fā)現(xiàn)自己被綠了吏恭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡重罪,死狀恐怖樱哼,靈堂內(nèi)的尸體忽然破棺而出哀九,到底是詐尸還是另有隱情,我是刑警寧澤搅幅,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布阅束,位于F島的核電站,受9級特大地震影響茄唐,放射性物質發(fā)生泄漏围俘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一琢融、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧簿寂,春花似錦漾抬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至克胳,卻和暖如春平绩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漠另。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工捏雌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笆搓。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓性湿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親满败。 傳聞我的和親對象是個殘疾皇子肤频,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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