首頁 >web前端 >js教程 >淺談es6 javascript的map資料結構_javascript技巧

淺談es6 javascript的map資料結構_javascript技巧

韦小宝
韦小宝原創
2017-12-15 14:06:191335瀏覽

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

本文介紹了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


以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。


相關推薦:

#ie8 不支援javascript map 方法

JavaScript mapreduce工作原理簡析_基礎知識

#基於javascript 明確轉換與隱含轉換(詳解)_javascript技巧#

以上是淺談es6 javascript的map資料結構_javascript技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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