Map
- Map 是 ES6 提供的構(gòu)造函數(shù)荤胁,能造出一種新的存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu)嘉汰。本質(zhì)上為鍵值對(duì)的集合
- key 對(duì)應(yīng) value媒佣,key 和 value 唯一斋扰,任何值都可以當(dāng)屬性
- 可以讓對(duì)象當(dāng)屬性,去重
基本用法
let op = new Map([["name","ccc"],["age","3"]])
console.log(op);
// Map(2) {"name" => "ccc", "age" =>"3"}
let op = new Map([[{},"ccc"]])
console.log(op);
// Map(2) {{} => "ccc"}
在 Map
中任何值都可以當(dāng)屬性央星,上面的代碼中霞怀,用了一個(gè)空對(duì)象當(dāng)做屬性。
Map 上的方法
// set(); 增加屬性和屬性值
let op = new Map();
op.set('name','ccc');
op.set({},'xxx');
// get(); 取出屬性值
op.get("name"); // 輸出 ccc
// 在取值原始值的時(shí)候要用一個(gè)變量去接受
const obj = {};
op.get(obj); // 輸出 xxx
// delete 刪除 不舉例
// clear 清空 不舉例
// has 是否有屬性 不舉例
// size map 構(gòu)造對(duì)象出來(lái)的長(zhǎng)度
op.size() // 輸出 4
// keys 拿到屬性
op.keys() // MapIterator {"name", {}}
// forEach 遍歷
op.forEach(ele =>{
console.log(ele)
// 輸出 ccc , xxx
})
// for of 遍歷
for(let porp of op) {
console.log(porp);
// 輸出 ["name","ccc"] [{},"xxx"] 返回鍵值對(duì)
// 想要拿到屬性和值
console.log(porp[0], porp[1])
}
模擬實(shí)現(xiàn) Map
原理實(shí)現(xiàn)
- 鏈接鏈表
- hash算法
- 桶
鏈接鏈表
let a = {
name: 'ttt',
next: b
}
let b = {
name: 'xxx',
next: c
}
let c = {
name: 'ccc',
next: null
}
這種 a.next
可以訪問(wèn)到 b
莉给,a.next.next
可以訪問(wèn)到 c
毙石,連成鏈的方式叫鏈表,Map 在存值的時(shí)候就用到了鏈表的概念颓遏。在 Map 里面的成員都存到了對(duì)象里面去胁黑,之后再放到數(shù)組里面去
let op = new Map([['name1', 'ttt'],['name2', 'xxx']]);
/* 把 Map 里面的成員存到對(duì)象里面去 */
{
key: 'name1',
value: 'ttt'
}
{
key: 'name2',
value: 'ccc'
}
// 桶
[
{},
// 鏈?zhǔn)酱鎯?chǔ)
{
next:{
key: 'name1',
value: 'ttt',
// 按照 key 值固定對(duì)象 通過(guò) hash 算法固定
next: {
key: 'name2',
value: 'ccc'
}
}
},
{},
{},
{},
{},
{},
{}
]
上面的代碼,就是把 Map 里面的成員變量存到對(duì)象里面去州泊,在通過(guò)數(shù)組鏈?zhǔn)酱鎯?chǔ),通過(guò) key 值利用 hash 固定對(duì)象漂洋。利用 hash 算法的主要目的是要把不定范圍的值轉(zhuǎn)換成特定范圍的值遥皂。比如在存值的時(shí)候 key 的類(lèi)型是不一樣的力喷,可能是 String、Number演训,所以要把這些不定范圍的值轉(zhuǎn)換成特定范圍的值弟孟。