JS中常用的數(shù)據(jù)結(jié)構(gòu)

JS中常用的數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu).jpg

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ū)別:
  1. WeakSet只能存放對(duì)象引用羞芍,而Set可以存放任何類型的值哗戈。
  2. WeakSet 對(duì)象中儲(chǔ)存的對(duì)象值都是被弱引用的,即垃圾回收機(jī)制不考慮 WeakSet對(duì)該對(duì)象的引用荷科,如果沒有其他的變量或?qū)傩砸眠@個(gè)對(duì)象值唯咬,則這個(gè)對(duì)象將會(huì)被垃圾回收掉(不考慮該對(duì)象還存在于 WeakSet中),運(yùn)行前后成員個(gè)數(shù)可能會(huì)不一致畏浆,遍歷結(jié)束之后胆胰,有的成員可能取不到了(被垃圾回收)。
  3. clear()方法不可用刻获。
  4. WeakSet對(duì)象是無法被遍歷的(ES6 規(guī)定 WeakSet 不可遍歷)蜀涨,也沒有辦法拿到它包含的所有元素。
  5. 其余無差別。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涡上,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拒名,更是在濱河造成了極大的恐慌吩愧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件增显,死亡現(xiàn)場(chǎng)離奇詭異雁佳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)同云,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門糖权,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人炸站,你說我怎么就攤上這事星澳。” “怎么了旱易?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵禁偎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我阀坏,道長(zhǎng)如暖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任忌堂,我火速辦了婚禮盒至,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘士修。我一直安慰自己枷遂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布李命。 她就那樣靜靜地躺著登淘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪封字。 梳的紋絲不亂的頭發(fā)上黔州,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天耍鬓,我揣著相機(jī)與錄音,去河邊找鬼流妻。 笑死牲蜀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绅这。 我是一名探鬼主播涣达,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼证薇!你這毒婦竟也來了度苔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤浑度,失蹤者是張志新(化名)和其女友劉穎寇窑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箩张,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甩骏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了先慷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饮笛。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖论熙,靈堂內(nèi)的尸體忽然破棺而出福青,到底是詐尸還是另有隱情,我是刑警寧澤赴肚,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布素跺,位于F島的核電站,受9級(jí)特大地震影響誉券,放射性物質(zhì)發(fā)生泄漏指厌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一踊跟、第九天 我趴在偏房一處隱蔽的房頂上張望踩验。 院中可真熱鬧,春花似錦商玫、人聲如沸箕憾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袭异。三九已至,卻和暖如春炬藤,著一層夾襖步出監(jiān)牢的瞬間御铃,已是汗流浹背碴里。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留上真,地道東北人咬腋。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像睡互,于是被迫代替她去往敵國(guó)和親根竿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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