ES6學(xué)習(xí)筆記--Set與Map

Set

Set 是不包含重復(fù)值的列表赖淤。常見的Set使用場(chǎng)景是檢查某個(gè)值是否存在.

Set實(shí)例需要用new Set()來創(chuàng)建,Set 構(gòu)造器實(shí)際上可以接收任意可迭代對(duì)象作為參數(shù)就谜。構(gòu)造器會(huì)使用迭代器來提取參數(shù)中的值。

Set 不會(huì)使用強(qiáng)制類型轉(zhuǎn)換來判斷值是否重復(fù)。這意味著 Set 可以同時(shí)包含數(shù)值 5 與 字符串 "5" 劈伴,將它們都作為相對(duì)獨(dú)立的項(xiàng)

Set方法:

  • add() 向Set中添加項(xiàng)目
  • size() 檢查Set中有多少項(xiàng)
  • delete() 移除值
  • has() 判斷值是否存在,返回布爾值
  • clear() 清空Set
  • forEach() 遍歷Set項(xiàng),需要傳入一個(gè)回調(diào)函數(shù),該函數(shù)接受3個(gè)參數(shù):1.Set中下個(gè)位置的值,2.與第一個(gè)參數(shù)相同的值(為了與Map,數(shù)組里的forEach函數(shù)保持參數(shù)一致) 3.目標(biāo)Set自身

WeakSet

為了解決大型項(xiàng)目中的內(nèi)存泄漏,引入了該對(duì)象弊攘。
該類型只允許存儲(chǔ)對(duì)象弱引用,而不能存儲(chǔ)基本類型的值摔癣。

Weak Set 與 Set 關(guān)鍵的差異:

  • 對(duì)于 WeakSet 的實(shí)例奴饮,只要調(diào)用 add() 、 has() 或 delete() 方法時(shí)傳入了非對(duì)象的參數(shù)择浊,就會(huì)拋出錯(cuò)誤拐云;
  • Weak Set 不可迭代,因此不能被用在 for-of 循環(huán)中近她;
  • Weak Set 無法暴露出任何迭代器(例如 keys() 與 values() 方法)叉瘩,因此沒有任何編程手段可用于判斷 Weak Set 的內(nèi)容;
  • Weak Set 沒有 forEach() 方法粘捎;
  • Weak Set 沒有 size 屬性薇缅。

Map

Map 是鍵與相對(duì)應(yīng)的值的集合危彩。通過指定所需讀取的鍵即可檢索對(duì)應(yīng)的值。 Map 常被用作緩存泳桦,存儲(chǔ)數(shù)據(jù)以便此后快速檢索汤徽。類型是鍵值對(duì)的有序列表,而鍵和值都可以是任意類型灸撰。

size屬性表示map中的鍵值對(duì)數(shù)量

Map初始化

將數(shù)組傳遞給 Map 構(gòu)造器谒府,以便使用數(shù)據(jù)來初始化一個(gè) Map 。該數(shù)組中的每一項(xiàng)也必須是數(shù)組浮毯,內(nèi)部數(shù)組的首個(gè)項(xiàng)會(huì)作為鍵完疫,第二項(xiàng)則為對(duì)應(yīng)值。因此整個(gè) Map 就被這些雙項(xiàng)數(shù)組所填充债蓝。

let map = new Map([["name", "Polo"], ["age", 30]]);

console.log(map.has("name"));   // true
console.log(map.get("name"));   // "Polo"
console.log(map.has("age"));    // true
console.log(map.get("age"));    // 30
console.log(map.size);          // 2

Map方法:

  • set(key,val) 設(shè)置鍵值對(duì)
  • get(key) 獲得key對(duì)應(yīng)的值
  • has(key) 判斷key是否存在
  • delete(key) 刪除key及對(duì)應(yīng)的值
  • clear() 清空map
  • forEach(cb) cb是一個(gè)能接收三個(gè)參數(shù)的回調(diào)函數(shù) 1.Map中下個(gè)位置的值,2.值對(duì)應(yīng)的key,3.目標(biāo)Map自身
let map = new Map([ ["name", "Nicholas"], ["age", 25]]);
map.forEach(function(value, key, ownerMap) {
    console.log(key + " " + value);
    console.log(ownerMap === map);
});

WeakMap

WeakMap是存儲(chǔ)對(duì)象弱引用的方式壳鹤。所有的鍵都必須是對(duì)象,使用非對(duì)象的鍵會(huì)拋出錯(cuò)誤,而且這些對(duì)象都是弱引用饰迹,不會(huì)干擾垃圾回收芳誓。。當(dāng) Weak Map 中的鍵在 Weak Map 之外不存在引用時(shí)啊鸭,該鍵值對(duì)會(huì)被移除锹淌。

Weak Map 只有兩個(gè)附加方法能用來與鍵值對(duì)交互。 has() 方法用于判斷指定的鍵是否存在于 Map 中赠制,而 delete() 方法則用于移除一個(gè)特定的鍵值對(duì)赂摆。不能clear,也不能forEach,因?yàn)椴豢傻?/p>

可以利用WeakMap在對(duì)象實(shí)例中存儲(chǔ)私有數(shù)據(jù)。舉例如下:

let Person = (function() {

    let privateData = new WeakMap();

    function Person(name) {
        privateData.set(this, { name: name });
    }

    Person.prototype.getName = function() {
        return privateData.get(this).name;
    };

    return Person;
}());

此版本的 Person 范例使用了 Weak Map 而不是對(duì)象來保存私有數(shù)據(jù)憎妙。
當(dāng) Person 構(gòu)造器被調(diào)用時(shí)库正,將 this 作為鍵在 Weak Map 上建立了一個(gè)入口,而包含私有信息的對(duì)象成為了對(duì)應(yīng)的值厘唾,其中只存放了 name 屬性褥符。通過將 this 傳遞給 privateData.get() 方法,以獲取值對(duì)象并訪問其 name 屬性抚垃, getName() 函數(shù)便能提取私有信息喷楣。這種技術(shù)讓私有信息能夠保持私有狀態(tài),并且當(dāng)與之關(guān)聯(lián)的對(duì)象實(shí)例被銷毀時(shí)鹤树,私有信息也會(huì)被同時(shí)銷毀铣焊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市罕伯,隨后出現(xiàn)的幾起案子曲伊,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坟募,死亡現(xiàn)場(chǎng)離奇詭異岛蚤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)懈糯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門涤妒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赚哗,你說我怎么就攤上這事她紫。” “怎么了屿储?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵贿讹,是天一觀的道長。 經(jīng)常有香客問我扩所,道長围详,這世上最難降的妖魔是什么朴乖? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任祖屏,我火速辦了婚禮,結(jié)果婚禮上买羞,老公的妹妹穿的比我還像新娘袁勺。我一直安慰自己,他們只是感情好畜普,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布期丰。 她就那樣靜靜地躺著,像睡著了一般吃挑。 火紅的嫁衣襯著肌膚如雪钝荡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天舶衬,我揣著相機(jī)與錄音埠通,去河邊找鬼。 笑死逛犹,一個(gè)胖子當(dāng)著我的面吹牛端辱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虽画,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼舞蔽,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了码撰?” 一聲冷哼從身側(cè)響起渗柿,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脖岛,沒想到半個(gè)月后朵栖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砾省,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年混槐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了编兄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡声登,死狀恐怖狠鸳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悯嗓,我是刑警寧澤件舵,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站脯厨,受9級(jí)特大地震影響铅祸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜合武,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一临梗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稼跳,春花似錦盟庞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至红淡,卻和暖如春不狮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背在旱。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工摇零, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颈渊。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓遂黍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俊嗽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雾家,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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