ES6——Map致讥、Set

  • 在ES6之前仅仆,我們存儲數(shù)據(jù)的結(jié)構(gòu)主要有兩種:數(shù)組、對象垢袱。
  • 在ES6中新增了另外兩種數(shù)據(jù)結(jié)構(gòu):Set墓拜、Map,以及它們的另外形式WeakSet请契、WeakMap咳榜。

Set和WeakSet

Set的使用

  • Set是一個新增的數(shù)據(jù)結(jié)構(gòu),可以用來保存數(shù)據(jù)爽锥,類似于數(shù)組涌韩,但是和數(shù)組的區(qū)別是元素不能重復(fù)。
  • 創(chuàng)建Set我們需要通過Set構(gòu)造函數(shù)(暫時沒有字面量創(chuàng)建的方式):
  • 可以發(fā)現(xiàn)Set中存放的元素是不會重復(fù)的氯夷,那么Set有一個非常常用的功能就是給數(shù)組去重臣樱。
//通過new關(guān)鍵字創(chuàng)建
const set1 = new Set();
set1.add(1)
set1.add(2)
set1.add(2)
set1.add({name:13})
console.log(set1);  //Set(3) { 1, 2, { name: 13 } }

//根據(jù)數(shù)組創(chuàng)建set對象
const set2 = new Set([1,2,3,4,5,5])
console.log(set2);  //Set(5) { 1, 2, 3, 4, 5 }

//將set轉(zhuǎn)變?yōu)閿?shù)組
const newArray1 = [...set2]
console.log(newArray1);
const newArray2 = Array.from(set2)
console.log(newArray2);

Set的常見屬性和方法

  • size:返回Set中元素的個數(shù);

method:

  • add(value):添加某個元素腮考,返回Set對象本身雇毫;
  • delete(value):從set中刪除和這個值相等的元素,返回boolean類型踩蔚;
  • has(value):判斷set中是否存在某個元素棚放,返回boolean類型;
  • clear():清空set中所有的元素馅闽,沒有返回值飘蚯;
  • forEach(callback, [, thisArg]):通過forEach遍歷set;
  • Set是支持for of的遍歷的福也。

WeakSet的使用

  • 和Set類似的另外一個數(shù)據(jù)結(jié)構(gòu)稱之為WeakSet孝冒,也是內(nèi)部元素不能重復(fù)的數(shù)據(jù)結(jié)構(gòu)。
  • 和Set的區(qū)別
    區(qū)別一:WeakSet中只能存放對象類型拟杉,不能存放基本數(shù)據(jù)類型庄涡;
    區(qū)別二:WeakSet對元素的引用是弱引用,如果沒有其他引用對某個對象進(jìn)行引用搬设,那么GC可以對該對象進(jìn)行回收(弱引用可以理解為有地址指向?qū)ο笱ǖ辏菍ο笠廊荒軌虮讳N毀)撕捍;
const wset = new WeakSet()
const obj1 = {
  name:"zs",
  age:14
}
const obj12 = {
  name:"zsss",
  age:142
}
wset.add(10) //報錯:invalid val used
wset.add(obj1)
wset.add(obj12)
console.log(wset);

WeakSet常見的方法:

  • add(value):添加某個元素,返回WeakSet對象本身泣洞;
  • delete(value):從WeakSet中刪除和這個值相等的元素忧风,返回boolean類型;
  • has(value):判斷WeakSet中是否存在某個元素球凰,返回boolean類型狮腿;
const wset = new WeakSet();
const obj1 = {
  name: "zs",
  age: 14,
};
const obj2 = {
  name: "zsss",
  age: 142,
};

const obj3 = {
  name: "zsss",
  age: 142,
};
// wset.add(10)
wset.add(obj1);
wset.add(obj2);

console.log(wset.has(obj2)); //true
console.log(wset.has(obj3)); //false,注意

wset.delete(obj2);
console.log(wset.has(obj2)); //false

WeakSet的應(yīng)用

  • 阻止其他的對象的借用調(diào)用
const wset = new WeakSet();
class Person {
  constructor() {
    wset.add(this);  //將創(chuàng)建的對象保存到weakset中
  }
  running() {
    //每次調(diào)用該方法先判斷weakset中是否有保證該對象呕诉,保證只有Person類的子對象可以調(diào)用
    if (!wset.has(this)) {
      throw new Error("不能通過其他類型的對象調(diào)用running方法");
    }
    console.log("running", this);
  }
}

Map和WeakMap

Map的使用

  • Map用于存儲映射關(guān)系缘厢。
    之前我們可以使用對象來存儲映射關(guān)系,有什么區(qū)別呢甩挫?
    對象存儲映射關(guān)系只能用字符串(ES6新增了Symbol)作為屬性名(key)贴硫;某些情況下我們可能希望通過其他類型作為key,比如對象伊者,這個時候會自動將對象轉(zhuǎn)成字符串來作為key英遭;那么我們就可以使用Map:
const obj = { name: "zs", age: 18, height: 1.88 };
const obj2 = { name: "zsss", age: 11, height: 1.55 };

const map1 = new Map();
map1.set(obj, "abc");
map1.set(obj2, "bcd");
console.log(map1);
/* Map(2) {
  { name: 'zs', age: 18, height: 1.88 } => 'abc',
  { name: 'zsss', age: 11, height: 1.55 } => 'bcd'
} */

console.log(map1.get(obj)); //abc

Map的常用屬性方法

  • size:返回Map中元素的個數(shù);

Map常見的方法:

  • set(key, value):在Map中添加key亦渗、value挖诸,并且返回整個Map對象;
  • get(key):根據(jù)key獲取Map中的value法精;
  • has(key):判斷是否包括某一個key税灌,返回Boolean類型;
  • delete(key):根據(jù)key刪除一個鍵值對亿虽,返回Boolean類型菱涤;
  • clear():清空所有的元素;
  • forEach(callback, [, thisArg]):通過forEach遍歷Map洛勉;
  • Map也可以通過for of進(jìn)行遍歷粘秆。

WeakMap的使用

  • 和Map區(qū)別
    區(qū)別一:WeakMap的key只能使用對象,不接受其他的類型作為key收毫;
    區(qū)別二:WeakMap的key對對象想的引用是弱引用攻走,如果沒有其他引用引用這個對象,那么GC可以回收該對象此再;

WeakMap的常用屬性方法:

  • set(key, value):在Map中添加key昔搂、value,并且返回整個Map對象输拇;
  • get(key):根據(jù)key獲取Map中的value摘符;
  • has(key):判斷是否包括某一個key,返回Boolean類型;
  • delete(key):根據(jù)key刪除一個鍵值對逛裤,返回Boolean類型瘩绒;

WeakMap的應(yīng)用 :

  • vue3響應(yīng)式原理
//WeakMap(fkey(對象):value.}):key是一個對象,弱引用
const targetMap = new WeakMap();
function getDep(target, key) {
  //·1.根據(jù)對象(target)取出對應(yīng)的Map對象
  let depsMap = targetMap.get(target);
  if (!depsMap) {
    depsMap = new Map();
    targetMap.set(target, depsMap);
    //·2.取出具體的dep對象
    let dep = depsMap.get(key);
    if (!dep) dep = new Dep();
    depsMap.set(key, dep);
  }
  return dep;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末带族,一起剝皮案震驚了整個濱河市锁荔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝙砌,老刑警劉巖阳堕,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異择克,居然都是意外死亡恬总,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門祠饺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來越驻,“玉大人汁政,你說我怎么就攤上這事道偷。” “怎么了记劈?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵勺鸦,是天一觀的道長。 經(jīng)常有香客問我目木,道長换途,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任刽射,我火速辦了婚禮军拟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘誓禁。我一直安慰自己懈息,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布摹恰。 她就那樣靜靜地躺著辫继,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俗慈。 梳的紋絲不亂的頭發(fā)上姑宽,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音闺阱,去河邊找鬼炮车。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的示血。 我是一名探鬼主播棋傍,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼难审!你這毒婦竟也來了瘫拣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤告喊,失蹤者是張志新(化名)和其女友劉穎麸拄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體黔姜,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拢切,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了秆吵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淮椰。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纳寂,靈堂內(nèi)的尸體忽然破棺而出主穗,到底是詐尸還是另有隱情,我是刑警寧澤毙芜,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布忽媒,位于F島的核電站,受9級特大地震影響腋粥,放射性物質(zhì)發(fā)生泄漏晦雨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一隘冲、第九天 我趴在偏房一處隱蔽的房頂上張望闹瞧。 院中可真熱鬧,春花似錦展辞、人聲如沸奥邮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漠烧。三九已至,卻和暖如春靡砌,著一層夾襖步出監(jiān)牢的瞬間已脓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工通殃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留度液,地道東北人厕宗。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像堕担,于是被迫代替她去往敵國和親已慢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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