首頁 web前端 js教程 詳細解讀javascript中map資料結構

詳細解讀javascript中map資料結構

Jun 20, 2018 pm 05:00 PM
es6

這篇文章主要介紹了淺談es6 javascript的map資料結構,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

本文介紹了es6 javascript的map資料結構,分享給大家,具體如下:

Map 結構的目的和基本用法

JavaScript 的物件( Object), 基本上就是鍵值對的集合( Hash 結構), 但傳統上只能用字串當作鍵。這給它的使用帶來了很大的限制。

var data = {}; 
var element = document.getElementById('myp'); 
data[element] = 'metadata'; 
data['[object HTMLpElement]'] // "metadata"
登入後複製

上面程式碼原意是將一個 DOM 節點當作物件data的鍵, 但由於物件只接受字串作為鍵名, 所以element被自動轉為字串[object HTMLpElement]。

為了解決這個問題, ES6 提供了 Map 資料結構。它類似於對象, 也是鍵值對的集合, 但是“ 鍵” 的範圍不限於字串, 各種類型的值( 包括對象) 都可以當作鍵。也就是說, Object 結構提供了「 字串— 值」 的對應, Map 結構提供了「 值— 值」 的對應, 是一種更完善的 Hash 結構實作。如果你需要「 鍵值對」 的資料結構, Map 比 Object 更適合。

var m = new Map(); 
var o = { 
 p: 'Hello World' 
}; 
m.set(o, 'content') 
m.get(o) // "content" 
m.has(o) // true 
m.delete(o) // true 
m.has(o) // false
登入後複製

上面程式碼使用set方法, 將物件o當作m的一個鍵, 然後再使用get方法讀取這個鍵, 接著使用delete方法刪除了這個鍵。
作為建構函數, Map 也可以接受一個陣列作為參數。此陣列的成員是一個個表示鍵值對的陣列。

var map = new Map([ 
 ['name', ' 张三 '], 
 ['title', 'Author'] 
]); 
map.size // 2 
map.has('name') // true 
map.get('name') // " 张三 " 
map.has('title') // true 
map.get('title') // "Author"
登入後複製

上面程式碼在新建 Map 實例時,就指定了兩個鍵name和title。

Map 建構子接受陣列作為參數, 實際上執行的是下面的演算法。

var items = [ 
 ['name', ' 张三 '], 
 ['title', 'Author'] 
]; 
var map = new Map(); 
items.forEach(([key, value]) => map.set(key, value));
登入後複製

下面的範例中, 字串true和布林值true是兩個不同的鍵。

var m = new Map([ 
 [true, 'foo'], 
 ['true', 'bar'] 
]); 
m.get(true) // 'foo' 
m.get('true') // 'bar'
登入後複製

如果對同一個鍵多次賦值, 後面的值會覆寫前面的值。

let map = new Map(); 
map 
 .set(1, 'aaa') 
 .set(1, 'bbb'); 
map.get(1) // "bbb"
登入後複製

上面程式碼對鍵1連續賦值兩次, 後一次的值覆寫前一次的值。

如果讀取一個未知的鍵,則傳回undefined。

new Map().get('asfddfsasadf') 
 // undefined
登入後複製

注意, 只有對同一個物件的引用, Map 結構才將其視為同一個鍵。這一點要非常小心。

var map = new Map(); 
map.set(['a'], 555); 
map.get(['a']) // undefined
登入後複製

上面程式碼的set和get方法,表面是針對同一個鍵, 但實際上這是兩個值, 記憶體位址是不一樣的, 因此get方法無法讀取該鍵,傳回undefined。

同理, 同樣的值的兩個實例, 在 Map 結構中被視為兩個鍵。

var map = new Map(); 
var k1 = ['a']; 
var k2 = ['a']; 
map 
 .set(k1, 111) 
 .set(k2, 222); 
map.get(k1) // 111 
map.get(k2) // 222
登入後複製

上面程式碼中, 變數k1和k2的值是一樣的, 但是它們在 Map 結構中被視為兩個鍵。

由上可知, Map 的鍵其實是跟記憶體位址綁定的, 只要記憶體位址不一樣, 就視為兩個鍵。這就解決了同名屬性碰撞( clash) 的問題, 我們擴充別人的函式庫的時候, 如果使用物件作為鍵名, 就不用擔心自己的屬性與原作者的屬性同名。

如果 Map 的鍵是一個簡單類型的值( 數字、 字串、 布林值), 則只要兩個值嚴格相等, Map 將其視為一個鍵, 包括0和 - 0。另外, 雖然NaN不嚴格相等於自身, 但 Map 將其視為同一個鍵。

let map = new Map(); 
map.set(NaN, 123); 
map.get(NaN) // 123 
map.set(-0, 123); 
map.get(+0) // 123
登入後複製

上面是我整理給大家的,希望未來會對大家有幫助。

相關文章:

vue-cli設定檔(詳細教學)

#使用jQuery封裝animate.css(詳細教學)

在vuex中如何實作閒置狀態進行重設

以上是詳細解讀javascript中map資料結構的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

ES6怎麼求數組反轉 ES6怎麼求數組反轉 Oct 26, 2022 pm 06:19 PM

在ES6中,可以利用數組物件的reverse()方法來實現數組反轉,該方法用於顛倒數組中元素的順序,將最後一個元素放在第一位,而第一個元素放在最後,語法「array.reverse()」。 reverse()方法會修改原始數組,如果不想修改需要配合擴充運算子「...」使用,語法「[...array].reverse()」。

async是es6還是es7的 async是es6還是es7的 Jan 29, 2023 pm 05:36 PM

async是es7的。 async和await是ES7中新增內容,是對於非同步操作的解決方案;async/await可以說是co模組和生成器函數的語法糖,用更清晰的語意解決js非同步程式碼。 async顧名思義是「非同步」的意思,async用於聲明一個函數是異步的;async和await有一個嚴格規定,兩者都離不開對方,且await只能寫在async函數中。

小程式為什麼要將es6轉es5 小程式為什麼要將es6轉es5 Nov 21, 2022 pm 06:15 PM

為了瀏覽器相容。 ES6作為JS的新規範,加入了許多新的語法和API,但現代瀏覽器對ES6新特性支援不高,所以需將ES6程式碼轉換為ES5程式碼。在微信web開發者工具中,會預設使用babel將開發者ES6語法程式碼轉換為三端都能很好支援的ES5的程式碼,幫助開發者解決環境不同所帶來的開發問題;只需要在專案中配置勾選好「ES6轉ES5」選項即可。

es6怎麼找出2個數組中不同項 es6怎麼找出2個數組中不同項 Nov 01, 2022 pm 06:07 PM

步驟:1、將兩個陣列分別轉換為set類型,語法「newA=new Set(a);newB=new Set(b);」;2、利用has()和filter()求差集,語法“ new Set([...newA].filter(x =>!newB.has(x)))”,差集元素會被包含在一個set集合中返回;3、利用Array.from將集合轉為數組類型,語法“Array.from(集合)”。

es5和es6怎麼實現陣列去重 es5和es6怎麼實現陣列去重 Jan 16, 2023 pm 05:09 PM

es5中可以利用for語句和indexOf()函數來實現數組去重,語法“for(i=0;i<數組長度;i++){a=newArr.indexOf(arr[i]);if(a== -1){...}}」。在es6中可以利用擴充運算子、Array.from()和Set來去重;需要先將陣列轉為Set物件來去重,然後利用擴充運算子或Array.from()函數來將Set物件轉回數組即可。

es6暫時性死區是什麼意思 es6暫時性死區是什麼意思 Jan 03, 2023 pm 03:56 PM

在es6中,暫時性死區是語法錯誤,是指let和const命令使區塊形成封閉的作用域。在程式碼區塊內,使用let/const指令宣告變數之前,變數都是不可用的,在變數宣告之前屬於該變數的「死區」;這在語法上,稱為「暫時性死區」。 ES6規定暫時性死區和let、const語句不出現變量提升,主要是為了減少運行時錯誤,防止在變量聲明前就使用這個變量,從而導致意料之外的行為。

require是es6語法嗎 require是es6語法嗎 Oct 21, 2022 pm 04:09 PM

不是,require是CommonJS規範的模組化語法;而es6規範的模組化語法是import。 require是運行時加載,import是編譯時加載;require可以寫在程式碼的任意位置,import只能寫在文件的最頂端且不可在條件語句或函數作用域中使用;require運行時才引入模組的屬性所以效能相對較低,import編譯時引入模組的屬性所所以效能稍高。

es6怎麼判斷陣列裡總共有多少項 es6怎麼判斷陣列裡總共有多少項 Jan 18, 2023 pm 07:22 PM

在es6中,可以利用array物件的length屬性來判斷數組裡總共有多少項,即取得數組中元素的個數;該屬性可傳回數組中元素的數組,只需要使用「array.length」語句即可傳回表示數組物件的元素個數的數值,也就是長度值。

See all articles