字典是一種以鍵值對(key-value)存儲數據的數據結構。這個數據結構在js中很是廣泛,好比js中的對象就是這個數據結構,寫過js的人應該對字典很是熟悉。javascript
原書是用數組構建字典的,如今已經8012年了,再用數據一把梭就很low了,這裏咱們使用Map來構造字典這個數據結構。java
字典的方法和屬性 | 含義 |
---|---|
size(屬性) | 字典的大小 |
set(方法) | 向字典中添加數據 |
get(方法) | 在字典中查找數據 |
has(方法) | 判斷字典中是否有某個數據 |
delete(方法) | 刪除字典中的數據 |
clear(方法) | 清空字典 |
其實es2015中,字典(map)已經默認存在了,沒有必要再從新實現一遍。我在這裏直接講解下map吧。api
在js中map和對象是很是像的,都是採用鍵值對的數據結構。它們不一樣點是它們的key值。對象的key值只容許是字符串,而map的key值能夠是字符串、數字、對象等各類類型。數組
let m = new Map()
const key = {}
const key2 = {}
m.set(key, 'a')
m.set(key2, 'b')
console.log(m.get(key)) // a
console.log(m.get(key2)) // b
let obj = {}
obj[key] = 'a'
obj[key2] = 'b'
console.log(obj[key]) // b
console.log(obj[key2]) // b
複製代碼
使用對象存儲數據的時候,對象會默認把key值轉成字符串,key和key2轉成字符串都是[object Object],因此obj[key]和obj[key2]獲取的值是相同的都是b。而map是直接使用對象當作鍵值的,因此mapget(key)和map.get(key2)獲取的是a和b數據結構
size屬性返回Map結構的成員總數ui
let m = new Map()
m.set('a', 'a1')
m.set('b', 'b1')
console.log(m.size) // 2
複製代碼
set方法設置鍵名key對應的鍵值爲value,而後返回整個map結構,若是key值已經存在,則鍵值會更新spa
let m = new Map()
m.set('a', 'a1')
m.set('a', 'b1')
console.log(m) // Map(1) {"a" => "b1"}
複製代碼
獲取key對應的鍵值,若是key不存在,則返回undefinedcode
let m = new Map()
m.set('a', 'a1')
console.log(m.get('b')) // undefined
複製代碼
has方法返回一個布爾值,表示某個鍵是否在map對象中對象
let m = new Map()
m.set('a', 'a1')
console.log(m.has('b')) // false
複製代碼
delete方法刪除某個鍵,若是刪除成功則返回true,不然返回falseip
let m = new Map()
m.set('a', 'a1')
m.set('b', 'b1')
console.log(m.delete('b')) // true
console.log(m.delete('c')) // false
複製代碼
clear方法清空全部的成員,沒有返回值
let m = new Map()
m.set('a', 'a1')
m.set('b', 'b1')
console.log(m) // Map(2) {"a" => "a1", "b" => "b1"}
m.clear()
console.log(m) // Map(0) {}
複製代碼
let map = new Map()
map.set('a', 'a1')
map.set('b', 'b1')
for (let key of map.keys()) {
console.log(key)
}
// a
// b
for (let value of map.values()) {
console.log(value)
}
// a1
// b1
for (let [key, value] of map.entries()) {
console.log(key, value)
}
// a a1
// b b1
map.forEach((value, key) => {
console.log(value, key)
})
// a1 a
// b1 b
複製代碼
原書是使用數組模擬字典的,多是由於寫該書的時候,es2015還沒出現。es2015中的Map對象就是字典,並且具備良好的api,之後寫代碼能夠省去省去不少麻煩。