JavaScript?Map?和?Object?的區(qū)別解析
在JavaScript中,Map
和 Object
看起來都是用鍵值對來存儲數(shù)據(jù),那么他們有什么不同呢?
不同點(diǎn)
Key filed
在 Object 中, key 必須是簡單數(shù)據(jù)類型(整數(shù),字符串或者是 symbol),而在 Map 中則可以是 JavaScript 支持的所有數(shù)據(jù)類型,也就是說可以用一個(gè) Object 來當(dāng)做一個(gè)Map元素的 key。
元素順序
Map 元素的順序遵循插入的順序,而 Object 的則沒有這一特性。
繼承
Map 繼承自 Object 對象。
新建實(shí)例
Object 支持以下幾種方法來創(chuàng)建新的實(shí)例:
var obj = {...}; var obj = new Object(); var obj = Object.create(null);
Map 僅支持下面這一種構(gòu)建方法:
var map = new Map([[1, 2], [2, 3]]); // map = {1 => 2, 2 => 3}
數(shù)據(jù)訪問
Map 想要訪問元素,可以使用 Map 本身的原生方法:
map.get(1) // 2
Object 可以通過 .
和 [ ]
來訪問
obj.id; obj['id'];
判斷某個(gè)元素是否在 Map 中可以使用
map.has(1);
判斷某個(gè)元素是不是在 Object 中需要以下操作:
obj.id === undefined; // 或者 'id' in obj;
另外需要注意的一點(diǎn)是,Object 可以使用
Object.prototype.hasOwnProperty()
來判斷某個(gè)key是否是這個(gè)對象本身的屬性,從原型鏈繼承的屬性不包括在內(nèi)。
新增一個(gè)數(shù)據(jù)
Map 可以使用 set() 操作:
map.set(key, value) // 當(dāng)傳入的 key 已經(jīng)存在的時(shí)候,Map 會覆蓋之前的值
Object 新增一個(gè)屬性可以使用:
obj['key'] = value; obj.key = value; // object也會覆蓋
刪除數(shù)據(jù)
在 Object 中沒有原生的刪除方法,我們可以使用如下方式:
delete obj.id; // 下面這種做法效率更高 obj.id = undefined
需要注意的是,使用 delete 會真正的將屬性從對象中刪除,而使用賦值 undefined 的方式,僅僅是值變成了 undefined。屬性仍然在對象上,也就意味著 在使用 for … in… 去遍歷的時(shí)候,仍然會訪問到該屬性。
Map 有原生的 delete 方法來刪除元素:
var isDeleteSucceeded = map.delete(1); console.log(isDeleteSucceeded ); // true // 全部刪除 map.clear();
獲取size
Map 自身有 size 屬性,可以自己維持 size 的變化。
Object 則需要借助 Object.keys()
來計(jì)算
console.log(Object.keys(obj).length);
Iterating
Map 自身支持迭代,Object 不支持。
如何確定一個(gè)類型是不是支持迭代呢? 可以使用以下方法:
console.log(typeof obj[Symbol.iterator]); // undefined console.log(typeof map[Symbol.iterator]); // function
何時(shí)使用 Map ,何時(shí)使用 Object?
雖然Map 在很多時(shí)候優(yōu)于 Object,但是作為 JavaScript 最基礎(chǔ)的數(shù)據(jù)類型,還是有很多情景更適合使用 Object。
- 當(dāng)所要存儲的是簡單數(shù)據(jù)類型,并且 key 都為字符串或者整數(shù)或者 Symbol 的時(shí)候,優(yōu)先使用 Object ,因?yàn)镺bject可以使用 字符變量 的方式創(chuàng)建,更加高效。
- 當(dāng)需要在單獨(dú)的邏輯中訪問屬性或者元素的時(shí)候,應(yīng)該使用 Object,例如:
var obj = { id: 1, name: “It's Me!”, print: function(){ return Object Id: ${this.id}, with Name: ${this.name}; } } console.log(obj.print());//Object Id: 1, with Name: It's Me. // 以上操作不能用 Map 實(shí)現(xiàn)
- JSON 直接支持 Object,但不支持 Map
- Map 是純粹的 hash, 而 Object 還存在一些其他內(nèi)在邏輯,所以在執(zhí)行 delete 的時(shí)候會有性能問題。所以寫入刪除密集的情況應(yīng)該使用 Map。
- Map 會按照插入順序保持元素的順序,而Object做不到。
- Map 在存儲大量元素的時(shí)候性能表現(xiàn)更好,特別是在代碼執(zhí)行時(shí)不能確定 key 的類型的情況。
到此這篇關(guān)于JavaScript Map 和 Object 的區(qū)別的文章就介紹到這了,更多相關(guān)JavaScript Map 和 Object 區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JavaScript中利用Array和Object實(shí)現(xiàn)Map的方法
- Springboot通過ObjectMapper配置json序列化詳解
- 使用ObjectMapper把Json轉(zhuǎn)換為復(fù)雜的實(shí)體類
- JavaScript中Object、map、weakmap的區(qū)別分析
- JavaScript 中有了Object 為什么還需要 Map 呢
- JavaScript中Map與Object應(yīng)用場景
- JS中Map、WeakMap和Object的區(qū)別解析
- Javascript中Object和Map之間的轉(zhuǎn)換方法
- 面試???js中 Map和 Object 的區(qū)別小結(jié)
相關(guān)文章
前端js使用xlsx-js-style導(dǎo)出Excel文件并修飾單元格樣式
這篇文章主要給大家介紹了關(guān)于前端js使用xlsx-js-style導(dǎo)出Excel文件并修飾單元格樣式的相關(guān)資料,前端開發(fā)過程中經(jīng)常遇到導(dǎo)出excel的需求,需要的朋友可以參考下2023-08-08Webpack實(shí)現(xiàn)多頁面打包的方法步驟
本文主要介紹了Webpack實(shí)現(xiàn)多頁面打包的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01e.target與e.currentTarget對象的使用區(qū)別詳解
這篇文章主要為大家介紹了e.target與e.currentTarget的使用區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07JavaScript 實(shí)現(xiàn) Tab 點(diǎn)擊切換實(shí)例代碼
Tab 選項(xiàng)卡切換效果在現(xiàn)如今的網(wǎng)頁中,運(yùn)用的也是比較多的,包括點(diǎn)擊切換、滑動切換、延遲切換、自動切換等多種效果,在這篇博文里,我們是通過原生 JavaScript 來實(shí)現(xiàn) Tab 點(diǎn)擊切換的效果。2017-03-03js實(shí)現(xiàn)簡單的可切換選項(xiàng)卡效果
這篇文章主要介紹了js實(shí)現(xiàn)簡單的可切換選項(xiàng)卡效果的方法,涉及javascript操作css樣式實(shí)現(xiàn)切換選項(xiàng)卡的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04JavaScript可折疊區(qū)域?qū)崿F(xiàn)代碼
可折疊區(qū)域的基本思想:通過點(diǎn)擊某個(gè)地方來顯示或隱藏屏幕中的某個(gè)區(qū)域。2010-10-10JavaScript JSON數(shù)據(jù)處理全集(小結(jié))
這篇文章主要介紹了JavaScript JSON數(shù)據(jù)處理全集,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08