Set和Map數(shù)據(jù)結(jié)構(gòu)

Set (集合)

ES6提供了一種新的數(shù)據(jù)結(jié)構(gòu)Set,Set類似數(shù)組气筋,但值唯一编丘,本身為構(gòu)造函數(shù)买窟,用來生成Set數(shù)據(jù)結(jié)構(gòu)胚迫,可以容納任何數(shù)據(jù)類型的任何值
[value, value]形式

  • 創(chuàng)建Set
let set = new Set([1, 2, 2, 3])
console.log(set);
//Set(3) { 1, 2, 3 }

Set可以接受一個數(shù)組作為參數(shù)钝鸽,用來初始化

  • Set實例的屬性和方法

屬性:
Set.prototype.constructor構(gòu)造函數(shù)汇恤,默認為 Set函數(shù)
Set.prototype.size 返回Set實例成員的總數(shù)
方法:
分為操作方法和遍歷方法
1.操作方法
add() 向 Set 添加新元素,返回 Set 結(jié)構(gòu)本身拔恰。
clear() 清除所有成員因谎,沒有返回值
delete()刪除某個值,返回一個布爾值颜懊,表示刪除是否成功财岔。
has()返回一個布爾值风皿,表示該值是否為Set的成員

let set = new Set(),
    a = NaN,
    b = NaN,
    c = 1,
    d = '1'

set.add(a).add(b).add(c).add(d)

console.log(set); //Set(3) { NaN, 1, '1' }
向Set加入值時,不會發(fā)生類型轉(zhuǎn)換匠璧,1和 '1'是兩個不同的值桐款,類似于精確相等運算符,但是認為NaN等于自身

2.遍歷方法
keys()返回 Set 對象中值的數(shù)組夷恍。
values()與 keys() 相同魔眨。
entries()返回 Set 對象中值的數(shù)組。
forEach()為每個元素調(diào)用回調(diào)酿雪。

let set = new Set([1, 2, 2, 3])
console.log(set.keys());
console.log(set.values());
/* 
  [Set Iterator] { 1, 2, 3 }
  [Set Iterator] { 1, 2, 3 }
*/
Set 結(jié)構(gòu)沒有鍵名冰沙,只有鍵值(或者說鍵名和鍵值是同一個值),所以keys方法和values方法的行為完全一致执虹。

for (let key of set.keys()) {
  console.log(key);
}
1
2
3
let set = new Set([1, 2, 2, 3])
console.log(set.entries());
//[Set Entries] { [ 1, 1 ], [ 2, 2 ], [ 3, 3 ] }
entries方法返回的遍歷器拓挥,同時包括鍵名和鍵值,所以每次輸出一個數(shù)組袋励,它的兩個成員完全相等

for (let item of set.entries()) {
  console.log(item[0]);
}
1
2
3
let set = new Set([1, 2, 2, 3])
set.forEach(value => console.log(value * 10))
/* 
  10
  20
  30
*/

Map(字典)

JS中的對象(Object),本質(zhì)上是鍵值對的集合侥啤,但傳統(tǒng)上只能用字符串作為鍵,Map數(shù)據(jù)結(jié)構(gòu)類似于對象茬故,但鍵的內(nèi)容不拘束于字符串盖灸,任何類型的值(包括對象)都可當作鍵
[key, value]形式

  • 基本的 Map() 方法
    set()為 Map 對象中的鍵設(shè)置值。
    get()獲取 Map 對象中鍵的值磺芭。
    entries()返回 Map 對象中鍵/值對的數(shù)組
    keys()返回 Map 對象中鍵的數(shù)組赁炎。
    values()返回 Map 對象中值的數(shù)組。
  • 創(chuàng)建Map對象
var map = new Map()
var obj = {name : 'harry'}


let a = map.set(obj, 'potter') //將obj作為map的鍵钾腺,并為其設(shè)置鍵值
let b = map.get(obj) 

console.log(a); //Map(1) { { name: 'harry' } => 'potter' }
console.log(b); //potter
var arrObj = [
  ['name' ,'harry'],
  ['age' ,18],
  ['hobby' ,'magic']
]
var map = new Map(arrObj)

console.log(map); //Map(3) { 'name' => 'harry', 'age' => 18, 'hobby' => 'magic' }

Map構(gòu)造函數(shù)還可接受一個數(shù)組作為參數(shù)徙垫,數(shù)組成員為一個個鍵值對的數(shù)組成員

console.log(map.keys()); //[Map Iterator] { 'name', 'age', 'hobby' }
console.log(map.values());  //[Map Iterator] { 'harry', 18, 'magic' }
console.log(map.entries());
/* 
  [Map Entries] {
    [ 'name', 'harry' ],
    [ 'age', 18 ],
    [ 'hobby', 'magic' ]
  }
*/

for (let key of map.keys()) {
  console.log(key);
}
// name
// age
// hobby

for (let item of map.entries()) {
  console.log(item[0]);
}
// name
// age
// hobby
  • Map 的鍵實際上是跟內(nèi)存地址綁定的,只要內(nèi)存地址不一樣放棒,就視為兩個鍵(引用數(shù)據(jù)類型)
var map = new Map()

var arr = [1]

//鍵的內(nèi)存地址一樣
let a = map.set(arr, 'one')
let b = map.get(arr)

console.log(a); //Map(1) { [ 1 ] => 'one' }
console.log(b); //one
var map = new Map()

//鍵的內(nèi)存地址不同姻报,即使內(nèi)容相同
let a = map.set([1], 'one')
let b = map.get([1])

console.log(a); //Map(1) { [ 1 ] => 'one' }
console.log(b); //undefined

簡單數(shù)據(jù)類型(Number, String, Boolean)只要嚴格相等,Map將其視為一個鍵

  • 其他Map方法
    clear()刪除 Map 中的所有元素间螟。
    delete()刪除由鍵指定的元素吴旋。
    has()如果鍵存在,則返回 true厢破。
    forEach()為每個鍵/值對調(diào)用回調(diào)荣瑟。
var arrObj = [
  ['name' ,'harry'],
  ['age' ,18],
  ['hobby' ,'magic']
]
var map = new Map(arrObj)
console.log(map.has('age')); //true
console.log(map.has('height')); //false

map.delete('name')
console.log(map); //Map(2) { 'age' => 18, 'hobby' => 'magic' }

map.clear()
console.log(map); //Map(0) {}

map.forEach(callback, this)
forEach方法可以接受兩個參數(shù),第二個參數(shù)可為其指定this的指向

Set 和Map的區(qū)別

  • Map是鍵值對摩泪,Set是值的集合笆焰,鍵和值可以為任何值
  • Map可以通過get方法獲取值,Set不行加勤,因為Set只有值
  • 都能夠通過迭代器進行for ... of 遍歷
  • Set的值唯一仙辟,可以用來做數(shù)組去重,Map沒有格式限制鳄梅,可以做數(shù)據(jù)存儲

WeakSet和WeakMap

WeakSet

WeakSet和Set類似叠国,但其成員只能為對象,不能是其他類型的值戴尸,WeakSet中的對象都是弱引用粟焊,只存儲引用,不存儲值孙蒙,垃圾回收機制不考慮WeakSet對該對象的引用项棠,當沒有其他對象引用該對象時,垃圾回收機制會自動回收該對象占用的內(nèi)存挎峦,不考慮該對象還存在于 WeakSet 之中香追,基于此,WeakSet無法遍歷坦胶,因為我們無法確認其內(nèi)部成員是否還存在透典,有可能已被垃圾回收機制回收

  • 語法
    WeakSet 是一個構(gòu)造函數(shù),可以使用new命令顿苇,創(chuàng)建 WeakSet 數(shù)據(jù)結(jié)構(gòu)
    可接受一個數(shù)組或類數(shù)組對象作為參數(shù)
const a = [[1, 2], [3, 4]]
const ws = new WeakSet(a)
console.log(ws);

image.png

image.png

WeakSet結(jié)構(gòu)有三個方法:
add()向 WeakSet 實例添加一個新成員峭咒。
delete()清除 WeakSet 實例的指定成員
has()返回一個布爾值,表示某個值是否在 WeakSet 實例之中
三個方法與Set同名方法類似

WeakMap

WeakMap結(jié)構(gòu)與Map結(jié)構(gòu)類似纪岁,也是用于生成鍵值對的集合
WeakMap只接受對象作為鍵名(null除外)凑队,不接受其他類型的值作為鍵名
WeakMap的鍵名所指向的對象,不計入垃圾回收機制
鍵名是弱引用幔翰,鍵值可以是任意的漩氨,鍵名所指向的對象可以被垃圾回收,此時鍵名是無效的遗增。與WeakSet一樣才菠,無法遍歷

const obj = { 'name' : 'harry'}

const wm = new WeakMap()

wm.set(obj, 'potter')

console.log(wm);

image.png

WeakMap的方法
image.png

delete()
get()
has()
set()
用法與Map的同名方法類似

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贡定,隨后出現(xiàn)的幾起案子赋访,更是在濱河造成了極大的恐慌,老刑警劉巖缓待,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚓耽,死亡現(xiàn)場離奇詭異,居然都是意外死亡旋炒,警方通過查閱死者的電腦和手機步悠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘫镇,“玉大人鼎兽,你說我怎么就攤上這事答姥。” “怎么了谚咬?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵鹦付,是天一觀的道長。 經(jīng)常有香客問我择卦,道長敲长,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任秉继,我火速辦了婚禮祈噪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尚辑。我一直安慰自己辑鲤,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布杠茬。 她就那樣靜靜地躺著遂填,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澈蝙。 梳的紋絲不亂的頭發(fā)上吓坚,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音灯荧,去河邊找鬼礁击。 笑死,一個胖子當著我的面吹牛逗载,可吹牛的內(nèi)容都是我干的哆窿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼厉斟,長吁一口氣:“原來是場噩夢啊……” “哼挚躯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起擦秽,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤码荔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后感挥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缩搅,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年触幼,在試婚紗的時候發(fā)現(xiàn)自己被綠了硼瓣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡置谦,死狀恐怖堂鲤,靈堂內(nèi)的尸體忽然破棺而出亿傅,到底是詐尸還是另有隱情,我是刑警寧澤瘟栖,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布葵擎,位于F島的核電站,受9級特大地震影響慢宗,放射性物質(zhì)發(fā)生泄漏坪蚁。R本人自食惡果不足惜奔穿,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一镜沽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贱田,春花似錦缅茉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耗拓,卻和暖如春拇颅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乔询。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工樟插, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竿刁。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓黄锤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親食拜。 傳聞我的和親對象是個殘疾皇子鸵熟,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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