JS中常用的數(shù)據(jù)結(jié)構(gòu)
1.數(shù)組
元素之間有關(guān)聯(lián)性巨缘,數(shù)組有長(zhǎng)度添忘,可重復(fù),可嵌套數(shù)據(jù)若锁;
插入搁骑、刪除、添加等操作十分消耗性能又固,因?yàn)椴樵儽仨毐闅v 仲器。
在不需要指定名稱,只需要羅列出來的時(shí)候使用數(shù)組仰冠;如果需要指定名稱乏冀,則用下面的對(duì)象。
2.對(duì)象
鍵-->值洋只,根據(jù)鍵查找值辆沦,沒有長(zhǎng)度;
屬性沒有關(guān)聯(lián)性识虚,添加肢扯、刪除、插入的效率極高 担锤。
查找某個(gè)值蔚晨,必須遍歷鍵,獲取各值查找肛循;
查找某個(gè)鍵铭腕,直接獲取就可以得到這個(gè)鍵的值(速度最快);
在其他語言中多糠,對(duì)象的遍歷是無序的累舷,而js中對(duì)象的鍵是先添加先遍歷,遍歷順序固定
3.set(集合)
set對(duì)象允許你存儲(chǔ)任何類型的唯一值熬丧,無論是原始值或者是對(duì)象引用笋粟。
- 去重
Set 對(duì)象只存儲(chǔ)獨(dú)一無二的值怀挠,如果你想避免儲(chǔ)存重復(fù)值析蝴,這是比 Array 更好的選擇害捕,因?yàn)槭褂?Array,你需要使用額外的代碼去處理這種情況闷畸。
- 查找項(xiàng)
使用 indexOf() 或 includes() 去檢查一個(gè)項(xiàng)是否在數(shù)組中很慢尝盼。
- 刪除項(xiàng)
在 Set 中,可以使用值去刪除一項(xiàng)佑菩。而在 Array 中盾沫,需要splice()使用項(xiàng)的索引方法。一旦使用索引殿漠,速度是很慢的赴精。
- 插入項(xiàng):
在 Set 中新增一項(xiàng)比 Array 使用 push() 或者 unshift() 等方法新增一項(xiàng)要快的多。
- 排序NaN值
無法使用 Array 的 indexOf() 或者 includes() 去定位 NaN 值绞幌,
但 Set可以用來保存NaN和undefined蕾哟, 如果有重復(fù)的NaN, Set會(huì)認(rèn)為就一個(gè)NaN(實(shí)際上NaN!=NaN);
無序莲蜘,數(shù)據(jù)無關(guān)聯(lián)性谭确;查找時(shí)仍需遍歷(只能用for of遍歷) 查詢速度慢,插入(無法插入在前面)票渠,刪除逐哈,添加速度快
在一組無序不重復(fù)的數(shù)據(jù)中使用set
- Set.size
size屬性的默認(rèn)值為0
- 接受具有iterable接口的其他數(shù)據(jù)結(jié)構(gòu)作為參數(shù)
const set2 = new Set(document.querySelectorAll('div')); console.log(set.size);
遍歷
Array
可以采用下標(biāo)循環(huán),遍歷Map和Set就無法使用下標(biāo)问顷。為了統(tǒng)一集合類型昂秃,ES6標(biāo)準(zhǔn)引入了新的iterable
類型,Array杜窄、Map和Set都屬于iterable
類型肠骆。具有
iterable
類型的集合可以通過新的for ... of
循環(huán)來遍歷。
- WeakSet 與 Set 的區(qū)別:
- WeakSet只能存放對(duì)象引用羞芍,而Set可以存放任何類型的值哗戈。
- WeakSet 對(duì)象中儲(chǔ)存的對(duì)象值都是被弱引用的,即垃圾回收機(jī)制不考慮 WeakSet對(duì)該對(duì)象的引用荷科,如果沒有其他的變量或?qū)傩砸眠@個(gè)對(duì)象值唯咬,則這個(gè)對(duì)象將會(huì)被垃圾回收掉(不考慮該對(duì)象還存在于 WeakSet中),運(yùn)行前后成員個(gè)數(shù)可能會(huì)不一致畏浆,遍歷結(jié)束之后胆胰,有的成員可能取不到了(被垃圾回收)。
- clear()方法不可用刻获。
- WeakSet對(duì)象是無法被遍歷的(ES6 規(guī)定 WeakSet 不可遍歷)蜀涨,也沒有辦法拿到它包含的所有元素。
- 其余無差別。
4.map(字典)
- set和map的區(qū)別
同:set和map都是存儲(chǔ)不重復(fù)的值.
異:set中是以[value,value]存儲(chǔ)的厚柳,map中是以[key,value]存儲(chǔ)的氧枣。
- map和對(duì)象的區(qū)別
map 和對(duì)象都是鍵值對(duì)的集合,區(qū)別在于對(duì)象的 key值全部自動(dòng)轉(zhuǎn)成了字符串或者symbol值别垮;
而map 是完整的值 便监,鍵可以是任意類型,可以是任意類型 碳想,可遍歷鍵烧董,也可遍歷值,數(shù)據(jù)之間沒有關(guān)聯(lián)性
遍歷速度比對(duì)象更快胧奔,可以單獨(dú)遍歷其中的鍵或者值
for(key of map.keys()){
//遍歷鍵
}
for(key of map.keys()){
//遍歷值
}
- weakmap和map的區(qū)別
WeakMap 對(duì)象是一組鍵值對(duì)的集合逊移,其中的鍵是弱引用對(duì)象,而值可以是任意龙填。
注意胳泉,WeakMap 弱引用的只是鍵名,而不是鍵值觅够。鍵值依然是正常引用胶背。
WeakMap 中,每個(gè)鍵對(duì)自己所引用對(duì)象的引用都是弱引用喘先,在沒有其他引用和該鍵引用同一對(duì)象钳吟,這個(gè)對(duì)象將會(huì)被垃圾回收(相應(yīng)的key則變成無效的),所以窘拯,WeakMap 的 key 是不可枚舉的红且。
5.總結(jié)
- Set
成員唯一、無序且不重復(fù)
[value, value]涤姊,鍵值與鍵名是一致的(或者說只有鍵值暇番,沒有鍵名)
可以遍歷,方法有:add思喊、delete壁酬、has
- WeakSet
成員都是對(duì)象;
成員都是弱引用恨课,可以被垃圾回收機(jī)制回收舆乔,可以用來保存DOM節(jié)點(diǎn)来累,不容易造成內(nèi)存泄漏睹晒;
不能遍歷谜慌,方法有add滚秩、delete、has
- Map
本質(zhì)上是鍵值對(duì)的集合祈纯,類似集合
可以遍歷妙痹,方法很多可以跟各種數(shù)據(jù)格式轉(zhuǎn)換
- WeakMap
只接受對(duì)象作為鍵名(null除外)拙寡,不接受其他類型的值作為鍵名
鍵名是弱引用,鍵值可以是任意的鳞上,鍵名所指向的對(duì)象可以被垃圾回收这吻,此時(shí)鍵名是無效的 不能遍歷,方法有g(shù)et因块、set橘原、has籍铁、delete