日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
何時(shí)使用Map來代替普通的JS對(duì)象

 JS 普通對(duì)象 {key: 'value'} 用于存放結(jié)構(gòu)化數(shù)據(jù)。但有一件事我覺得很煩:對(duì)象鍵必須是字符串(或很少使用的 symbol)。

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),銅梁企業(yè)網(wǎng)站建設(shè),銅梁品牌網(wǎng)站建設(shè),網(wǎng)站定制,銅梁網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,銅梁網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

如果將數(shù)字用作鍵會(huì)怎樣?在這種情況下不會(huì)有錯(cuò)誤:

JS 會(huì)隱式地將對(duì)象的鍵轉(zhuǎn)換為字符串,這種默認(rèn)行為丟失了類型的一致性,要解決也挺棘手的。但 ES6 中的Map 對(duì)象可以幫我們解決這類的問題,Look See See。

1. Map 接受任何類型的鍵

如前所述,如果對(duì)象的鍵不是 string 或 symbol,JS 將隱式地將其轉(zhuǎn)換為字符串。

幸運(yùn)的是,map 的鍵類型沒有問題

1 和 2 是 numbersMap 中的鍵,這些鍵的類型(數(shù)字)保持不變。

可以在 mpa 中使用任何鍵類型:數(shù)字、布爾值、字符串和 symbol。

booleansMap 使用 booleans 作為鍵,沒有問題。相反,布爾鍵在普通對(duì)象中不起作用。

來突破一下想象:是否將整個(gè)對(duì)象作為 map 的鍵,答案:可以的。

1.1 對(duì)象作為鍵

假設(shè)你需要存儲(chǔ)一些與對(duì)象相關(guān)的數(shù)據(jù),而不需要將這些數(shù)據(jù)附加到對(duì)象本身。使用普通對(duì)象是不可能的。

解決方法是使用對(duì)象-值元組數(shù)組:

kindOfMap 是一個(gè)數(shù)組,包含對(duì)象和關(guān)聯(lián)值的對(duì)。

這種方法最大的問題是按鍵訪問值的復(fù)雜度O(n),咱們必須遍歷整個(gè)數(shù)組才能通過鍵獲得所需的值。

WeakMap (Map的一個(gè)專門版本)不需要這么麻煩就能做到上面的事情:它只接受對(duì)象作為鍵。

Map 和 Weakmap 之間的主要區(qū)別是,Weakmap 允許對(duì)鍵對(duì)象進(jìn)行垃圾收集,從而防止內(nèi)存泄漏。

好了,用 WeakMap 重構(gòu)上面的代碼就變得很簡(jiǎn)單了:

與 Map 相反,WeakMap 只接受對(duì)象作為鍵,并少了一些方法。

2. map 對(duì)鍵名沒有限制

JS 中的任何對(duì)象都從原型對(duì)象繼承屬性,普通對(duì)象也是如此。

如果重寫從原型繼承的屬性,則可能會(huì)破壞依賴這些原型屬性的代碼:

在對(duì)象參與者上定義的屬性 toString 覆蓋從原型繼承的 toString() 方法。這中斷了isObject(),因?yàn)樗蕾囉?toString() 方法。

檢查普通對(duì)象從原型繼承的屬性和方法的列表, 避免使用這些方法名定義自定義屬性。

例如,假設(shè)有一個(gè)管理某些自定義字段的用戶界面。用戶可以通過指定名稱和值來添加自定義字段:

將定制字段的狀態(tài)存儲(chǔ)到普通對(duì)象中會(huì)很方便:

但是用戶可能會(huì)選擇一個(gè)自定義字段名稱,例如toString(如示例中所示),構(gòu)造函數(shù)等,這可能會(huì)破壞咱們的對(duì)象。

不要使用用戶輸入的值作為普通對(duì)象上鍵。

map 沒有這個(gè)問題,鍵值名稱不受限制:

不管 actorMap 有一個(gè)名為toString的屬性,toString()方法都可以正常工作。

3. map 是可迭代

為了遍歷普通對(duì)象的屬性,必須使用其他的輔助靜態(tài)函數(shù),如 Object.keys()或Object.entries():

Object.entries(colorsHex) 返回從對(duì)象提取的鍵值對(duì)數(shù)組。

但是,map 本身是可迭代的:

colorsHexMap是可迭代??梢栽谌魏谓邮艿牡胤绞褂盟?for()循環(huán),展開運(yùn)算符[...map]。

map 提供了返回可迭代方法:map.keys() 遍歷鍵,map.values() 遍歷值

4. map 的大小

普通對(duì)象的另一個(gè)問題是,您無法立馬知道它包含的屬性的數(shù)量。

要確定 exams 的大小,必須通過所有鍵來確定它們的數(shù)量。

map 提供了 size 屬性,表示屬性的數(shù)量。

確定 map 的屬性的數(shù)量更加簡(jiǎn)單:examsMap.size。

總結(jié)

普通 JS 對(duì)象通??梢院芎玫乇4娼Y(jié)構(gòu)化數(shù)據(jù),但它們也有一些局限性:

  • 只能用字符串或 sybmol 作為鍵
  • 自己的對(duì)象屬性可能會(huì)與從原型繼承的屬性鍵沖突(例如toString,constructor等)。
  • 對(duì)象不能用作鍵

所有這些問題都可以通過 map 輕松解決。而且,它們提供了諸如迭代器和易于進(jìn)行大小查找之類的好處。

不要將 map 當(dāng)作普通對(duì)象的替代品,而應(yīng)視為是普通對(duì)象補(bǔ)充。


當(dāng)前標(biāo)題:何時(shí)使用Map來代替普通的JS對(duì)象
網(wǎng)站URL:http://m.5511xx.com/article/dpscgej.html