Symbol

1营曼、概述
ES5對象屬性名都是字符串容易造成屬性名的沖突黄锤。

eg:var a = { name: 'lucy'};
a.name = 'lili';

這樣就會重寫屬性

ES6引入了一種新的原始數(shù)據(jù)類型Symbol肠缨,表示獨(dú)一無二的值佩憾。
七種數(shù)據(jù)類型
JavaScript 在 1997 年被標(biāo)準(zhǔn)化時掩蛤,就有 6 種數(shù)據(jù)類型枉昏,直到 ES6 出現(xiàn)之前,程序中的變量一定是以下 6 種數(shù)據(jù)類型之一:
Undefined
Null
Boolean
Number (包括 NAN)
String
Object

注意揍鸟,Symbol函數(shù)前不能使用new命令兄裂,否則會報錯。這是因為生成的Symbol是一個原始類型的值,不是對象
Symbol函數(shù)可以接受一個字符串作為參數(shù)懦窘,表示對Symbol實(shí)例的描述前翎,主要是為了在控制臺顯示,或者轉(zhuǎn)為字符串時畅涂,比較容易區(qū)分港华。

var sym1 = Symbol();
var sym2 = Symbol("foo");
var sym3 = Symbol("foo");
console.log(sym1, sym2, sym3) //輸出Symbol() Symbol(foo) Symbol(foo)

// 沒有參數(shù)的情況
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false

// 有參數(shù)的情況
var s1 = Symbol("foo");
var s2 = Symbol("foo");
s1 === s2 // false

Symbol值不能與其他類型的值進(jìn)行運(yùn)算
注:可以轉(zhuǎn)為字符串,布爾值午衰,不能轉(zhuǎn)為數(shù)值

2立宜、作為屬性名的Symbol

var mySymbol = Symbol();

// 第一種寫法
var a = {};
a[mySymbol] = 'Hello!';

// 第二種寫法
var a = {
  [mySymbol]: 'Hello!'
};

// 第三種寫法
var a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });

// 以上寫法都得到同樣結(jié)果
a[mySymbol] // "Hello!"

我們可以用typeof判斷某一個變量類型為Symbol類型:

typeof Symbol() === 'symbol' //輸出:true
typeof Symbol('foo') === 'symbol' //輸出: true
typeof Symbol.iterator === 'symbol' //輸出 : true

如果我們不知道Symbol的實(shí)例名字是什么,我們怎么獲取到Symbol值的呢, Symbol無法被for in 臊岸, for of循環(huán)橙数,以及Object.keys, Object.values 等都無法遍歷到Symbol的屬性; Object下給我們提供了一個

getOwnPropertySymbols帅戒;

let sym0 = Symbol("o_o?");
let obj = {
    [sym0] : "heheda"
}
for( let prop of Object.getOwnPropertySymbols(obj) ) {
    //prop就是Symbol的名字
    console.log( obj[prop] ); //輸出:heheda
};
或者用ES6提供的反射 : Reflect.ownKeys
let sym0 = Symbol("o_o?");
let obj = {
    [sym0] : "heheda"
}
console.log( Reflect.ownKeys(obj) ); //輸出:[ Symbol(o_o?) ]

Symbol.for和Symbol的唯一區(qū)別是 Symbol.for創(chuàng)建的兩個實(shí)例可能相等灯帮, 根據(jù)Symbol的參數(shù)生成實(shí)例, 如果參數(shù)一樣逻住, 那么會返回同一個實(shí)例钟哥;

let foo = Symbol.for( "1111" );
let bar = Symbol.for("1111");
console.log( foo === bar );  //輸出: true
//只有通過Symbol.for創(chuàng)建的對象,才能用keyFor找到原來的參數(shù)瞎访;
console.log(Symbol.keyFor(foo)) //會輸出:1111

當(dāng)出現(xiàn) key1 === key2 時就會有 Symbol.for( key1 ) === Symbol.for( key2 ) 腻贰。這種對應(yīng)關(guān)系甚至是跨 service worker 和 iframe 的。

let privateProperty1 = Symbol.for( 'firstName' );
let privateProperty2 = Symbol.for( 'firstName' );
 
myObject[ privateProperty1 ] = 'Dave';
myObject[ privateProperty2 ] = 'Zsolt';
 
console.log( myObject[ privateProperty1 ] );
// Zsolt

因為 Symbol 注冊表中的 Symbol 值和字符串之間有一一對應(yīng)的關(guān)系扒秸,所以我們也可以檢索字符串鍵播演。使用 Symbol.keyFor 方法。

Symbol.keyFor( privateProperty1 );
> "firstName"
 
Symbol.keyFor( Symbol() );
> undefined

Symbol 作為半私有屬性鍵

即使 Symbol 不能使屬性私有伴奥,它們也能用作帶有私有屬性的符號写烤。你可以使用 Symbol 來分隔公有和私有屬性的枚舉 ,Symbol 能使它更清楚拾徙。

const _width = Symbol('width');
class Square {
    constructor( width0 ) {
        this[_width] = width0;
    }
    getWidth() {
        return this[_width];
    }
}

只要你能隱藏 _width 就行了顶霞,隱藏 _width 的方法之一是創(chuàng)建閉包:

let Square = (function() {
 
    const _width = Symbol('width');
 
    class Square {
        constructor( width0 ) {
            this[_width] = width0;
        }
        getWidth() {
            return this[_width];
        }
    }
 
    return Square;  
 
} )();

這樣做的好處是,他人很難訪問到我們對象的私有 _width 值锣吼,而且也能很好地區(qū)分,哪些屬性是公有的蓝厌,哪些屬性是私有的玄叠。但這種方法的缺點(diǎn)也很明顯:

通過調(diào)用 Object.getOwnPropertySymbols ,我們可以使用 Symbol 鍵拓提。
如果要寫很多的代碼读恃,這會使得開發(fā)者的體驗不佳,訪問私有屬性不像 Java 或 TypeScript 那樣方便。
如果你要用 Symbol 來表示私有字段寺惫,那你需要表明哪些屬性不能被公開訪問疹吃,如若有人試圖違背這一規(guī)則,理應(yīng)承擔(dān)相應(yīng)的后果西雀。

內(nèi)置的Symbol值
有11個方法萨驶,具體可以查看http://es6.ruanyifeng.com/#docs/symbol

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市艇肴,隨后出現(xiàn)的幾起案子腔呜,更是在濱河造成了極大的恐慌,老刑警劉巖再悼,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件核畴,死亡現(xiàn)場離奇詭異,居然都是意外死亡冲九,警方通過查閱死者的電腦和手機(jī)谤草,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莺奸,“玉大人丑孩,你說我怎么就攤上這事『斗ぃ” “怎么了嚎杨?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長氧腰。 經(jīng)常有香客問我枫浙,道長,這世上最難降的妖魔是什么古拴? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任箩帚,我火速辦了婚禮,結(jié)果婚禮上黄痪,老公的妹妹穿的比我還像新娘紧帕。我一直安慰自己,他們只是感情好桅打,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布是嗜。 她就那樣靜靜地躺著,像睡著了一般挺尾。 火紅的嫁衣襯著肌膚如雪鹅搪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天遭铺,我揣著相機(jī)與錄音丽柿,去河邊找鬼恢准。 笑死,一個胖子當(dāng)著我的面吹牛甫题,可吹牛的內(nèi)容都是我干的馁筐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼坠非,長吁一口氣:“原來是場噩夢啊……” “哼敏沉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起麻顶,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赦抖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辅肾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體队萤,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年矫钓,在試婚紗的時候發(fā)現(xiàn)自己被綠了要尔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡新娜,死狀恐怖赵辕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情概龄,我是刑警寧澤还惠,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站私杜,受9級特大地震影響蚕键,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衰粹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一锣光、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铝耻,春花似錦誊爹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泡态,卻和暖如春搂漠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兽赁。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工状答, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刀崖。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓惊科,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亮钦。 傳聞我的和親對象是個殘疾皇子馆截,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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

  • 1.概述 ES5的對象屬性名都是字符串,這容易造成屬性名的沖突蜂莉。比如蜡娶,你使用了一個他人提供的對象,但又想為這個對象...
    趙然228閱讀 808評論 2 10
  • 1. 概述 ES6引入了一種新的原始數(shù)據(jù)類型Symbol映穗,表示獨(dú)一無二的值窖张。它是JavaScript語言的第七種數(shù)...
    ForeverYoung20閱讀 759評論 1 0
  • 前端技術(shù)日新月異,不斷有新技術(shù)出現(xiàn)蚁滋,我們就需要不斷地學(xué)習(xí)新知識宿接,雖然ES6已經(jīng)提出很久了,但是最近我才有時間靜下心...
    艱苦奮斗的侯小憨閱讀 4,163評論 3 5
  • 每天寫親子日記辕录,真的是一種習(xí)慣了睦霎,不管多晚多累,這件事已成為我生活的一部分了走诞,今天不說孩子就說說自己的生活吧副女!今天...
    云軒媽媽閱讀 114評論 0 0
  • 「招聘是最重要的事情」--《Google 是如何運(yùn)作的》 我們希望依靠良好的招聘機(jī)制,并配合優(yōu)秀的團(tuán)隊氛圍蚣旱,以吸引...
    Samuel_龔生閱讀 259評論 0 0