es6 map数据结构的定义和使用

一 基础信息

What:map是什么? 类似对象的键值对数据结构,但是“键”可以是任何类型的值(甚至是对象),也就是值-值的对应关系,是一种更完善的Hash结构的实现。

Why:为什么es6要提供map数据结构?

hash(哈希)结构就是键值对结构。传统上js只能用“字符串”做键,这带来了很大的限制,如下:

let data = {};
let element = document.getElementById('myDiv');    //一个dom,后边做键

data[element] = 'metadata';    //给data存储一个键值对
data['[object HTMLDivElement]'] // "metadata"

when:如上, 因为传统js的键名只能是字符串,所以把elementDOM自动转为字符串[object HTMLDivElement]。所以,在需要更全面的"键值对"数据对象时,Map比Object更完善。

const m = new Map();
const o = {p: 'Hello World'};

// map自带方法
m.set(o, 'content')        //set
m.get(o) // "content"    //get

m.has(o) // true    //has
m.delete(o) // true    //delete
m.has(o) // false 

map作为一个构造函数,可以接受一个数组作为参数,数组的格式是双元素-代表键和值,如下:

const map = new Map([
  ['name', '张三'],
  ['title', 'Author']
]);

其实Map内部执行了forEach算法,如下 :

const items = [
  ['name', '张三'],
  ['title', 'Author']
];

const map = new Map();

items.forEach(
  ([key, value]) => map.set(key, value)
);

事实上,凡是具有Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以做Map构造函数的参数,也就是说,“set”和“map”都可以用来生成新的map,如下:

const set = new Set([
  ['foo', 1],
  ['bar', 2]
]);

map读取位置键,则返回undefined。还有一种特殊情况也返回undefined:

const map = new Map();

map.set(['a'], 555);
map.get(['a']) // undefined

不可思议。上面set和get方法,表面上是针对同一个数组,实际上这俩数组的内存地址是不同的,因此get无法取值,返回undefined。所以,如果想要用get取数组值,set和get应该指向同一内存地址,也就是数组地址先存到一个变量里。

由上可知,Map的键实际是跟内存地址绑定的,这就解决了同名属性clash的问题。这样,我们扩展别人的库的时候,用对象作为键名,也不必担心与原作者的冲突了。

如果Map的键是简单类型的数据,则2个键名在完全相等的条件下,就视为同一个键。比如:0-0就是一个键,布尔值true和字符串true则是两个不同的键。

二 实例的属性和操作方法

属性:.size

方法:set,get,has,delete,clear

1.size 属性:返回Map数据结构的成员总数

const map = new Map();
map.set('foo', true);
map.set('bar', false);

map.size // 

2.Map.prototype.set(key, value)方法

设置键值对或者更新新值,(返回目前的Map,所以可链式写法。)

let map = new Map()
  .set(1, 'a')
  .set(2, 'b')
  .set(3, 'c');

3.Map.prototype.get(key)

读取key对应的值,没有则返回undefined

const m = new Map();

const hello = function() {console.log('hello');};
m.set(hello, 'Hello ES6!') // 键是函数

m.get(hello)  // Hello ES6!

4.Map.prototype.has(key)

检查key是否在Map中,返回布尔值

const m = new Map({
    'edition': 6,
    262: 'standard',
    undefined: 'nah'

});
m.has('edition')     // true
m.has('years')       // false

5.Map.prototype.delete(key)

删除指定的某个键值对,根据删除成功或者失败返回布尔值

const m = new Map({
    undefined: 'nah',
});

m.delete(undefined)
m.has(undefined)       // false

6.Map.prototype.clear()

清除所有成员,没有返回值 

let map = new Map({
    'foo': true,
    'bar': false
});
map.size // 2
map.clear()
map.size // 0

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值