ES6

ES6基本的语法(十一) Map

2021-02-24  本文已影响0人  StevenTang

Map

基本用法

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 中任何值都可以当属性,上面的代码中,用了一个空对象当做属性。

Map 上的方法


// set(); 增加属性和属性值
let op = new Map();
op.set('name','ccc');
op.set({},'xxx');

// get(); 取出属性值
op.get("name"); // 输出 ccc
// 在取值原始值的时候要用一个变量去接受
const obj = {};
op.get(obj); // 输出 xxx

// delete 删除 不举例
// clear 清空 不举例
// has 是否有属性 不举例

// size map 构造对象出来的长度
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"] 返回键值对
    // 想要拿到属性和值
    console.log(porp[0], porp[1])
}

模拟实现 Map

原理实现

链接链表


let a = {
    name: 'ttt',
    next: b
}

let b = {
    name: 'xxx',
    next: c
}

let c = {
    name: 'ccc',
    next: null
}

链式结构.png

这种 a.next 可以访问到 ba.next.next 可以访问到 c,连成链的方式叫链表,Map 在存值的时候就用到了链表的概念。在 Map 里面的成员都存到了对象里面去,之后再放到数组里面去

let op = new Map([['name1', 'ttt'],['name2', 'xxx']]);

/* 把 Map 里面的成员存到对象里面去 */

{
    key: 'name1',
    value: 'ttt'
}
{
    key: 'name2',
    value: 'ccc'
}

// 桶
[
    {},
    // 链式存储
    {
        next:{
            key: 'name1',
            value: 'ttt',
             // 按照 key 值固定对象 通过 hash 算法固定
            next: {
                key: 'name2',
                value: 'ccc'
            }
        }
    },
    {},
    {},
    {},
    {},
    {},
    {}
]

上面的代码,就是把 Map 里面的成员变量存到对象里面去,在通过数组链式存储,通过 key 值利用 hash 固定对象。利用 hash 算法的主要目的是要把不定范围的值转换成特定范围的值。比如在存值的时候 key 的类型是不一样的,可能是 String、Number,所以要把这些不定范围的值转换成特定范围的值。

Map实现原理
上一篇 下一篇

猜你喜欢

热点阅读