Map
Javascript的對象其實是鍵值對的集合(Hash結構),而鍵通常只能是 字符串 ,所以在es6
中為了解決這個問題,推出了Map
(值-值對應)數據結構,一種更完善的Hash結構實現
Api | 功能 |
---|---|
map.get(key) | 獲取鍵為key的value |
map.set(key, value) | 賦值,返回當前Map對象,所以可以map.set().set() |
map.has(key) | 是否存在 |
map.delete(key) | 刪除 |
map.size() | 成員數 |
map.cleaer() | 清空map |
遍歷器
iterator | 功能 |
---|---|
map.keys() | 遍歷鍵 |
map.values() | 遍歷值 |
map.entries() | 返回成員的遍歷器 |
map.forEach() | 遍歷所有成員 |
-
Map的構造函數接受一個課Iterator的值作為參數
const person = [ ['name', 'zhangsan', ], ['age', 23], ] const personMap = new Map(person) /** 上面的通過構造函數初始化其實是這樣實現的 */ const map = new Map() person.forEach(([key, value]) =>map.set(key, value)) return map // Map { 'name' => 'zhangsan', 'age' => 23 }
-
Map的鍵具有唯一性,如果鍵重復,前面的鍵將被后面的覆蓋
const person = [ ['name', 'zhangsan', ], ['age', 23], ['name', 'lisi'], ['age', 34] ] const personMap = new Map(person) // Map { 'name' => 'lisi', 'age' => 34 }
-
Map的鍵跟內存地址綁定,當鍵為對象時,只有對同一個鍵的引用,Map才會將其視為同一個鍵
// 先看一個比較熟悉的問題 let obj1 = ['a1'] let obj2 = ['a1'] // 此時修改obj1并不會引起obj2的改變 // 同理 const map = new Map() map.set(['test'], 'test') map.get(['test']) // undefined // 對象作為鍵時,Map只會將同一個地址的對象視為同一個鍵 const obj = ['test'] map.set(obj, 'test') map.get(obj) // test
-
如果是簡單類型的值作為鍵(數字,字符串,boolean,undefined, null,null不等于undefined,NaN,雖然NaN不嚴格等于自身,但在Map中是同一個鍵)
map.set(-0, 123); map.get(+0) // 123 map.set(true, 1); map.set('true', 2); map.get(true) // 1 map.set(undefined, 3); map.set(null, 4); map.get(undefined) // 3 map.set(NaN, 123); map.get(NaN) // 123