map是ES提供的一种字典数据结构。
字典结构——用来存储不重复key的hash结构。不同于集合(set)的是,字典使用的是键值对的形式来存储数据
JavaScript对象(object:{})只能用字符串来当key,这对使用带来了不便
为了解决这个问题,ES6提供了map数据结构。其类似于对象,也是键值对的集合,但“key”的范围不仅限于字符串,而是各种类型的值都可以当做key。也就是说,object提供了“字符串-值”的对应结构,map则提供的是“值-值”的对应。是一种更加完善的hash结构
对象对map结构的支持演示
var data1={a:1},
data2={b:2},
obj={};
//为obj对象添加属性(将data1和data2作为属性名)
obj[data1]=1;
obj[data2]=2;
console.log(obj);
可以看到结果并非我们需要的
创建一个map
const map=new Map([
['a',1],
['b',2]
]);
console.log(map);
上面的['a',1]代表,将a作为key,1作为value声明
那么是否['a',1]中能写入第三个元素呢?答案是可以的,但是!ES6不会理你
map类的属性——size 用于获取map的长度
console.log(map.size);
map类的方法——set Map.set(key,value) 设置键名key对应的键值为value,然后返回整个map结构。如果key已经有值,则键值会被更新,否则生成新的键
console.log(map.set([1,2,3],'3元素的数组'));
//也可以链式添加
map.set('name','张三').set('age',28);
console.log(map);
map类的方法——get Map.get(key) 读取key对应的键值,如果获取不到则返回undefined
console.log(map.get('name'));
获取数组对应的键值——后续补充
map类的方法——delete Map.delete(key) 删除某个键,如果删除成功返回true,否则返回false
console.log(map.delete('name'));
map类的方法——has Map.has(key) 判断某个键是否存在于map中,返回布尔值
console.log(map.has('age'));
map类的方法——clear Map.clear() 清除所有数据,没有返回值
map.clear();
map类的方法——keys Map.keys() 返回键名的遍历器
console.log(map.keys());
map类的方法——values Map.values() 返回键值的遍历器
console.log(map.values());
map类的方法——entries Map.entries() 返回键值对的遍历器
console.log(map.entries());
map类的方法——forEach map.forEach(function(){}) 使用回调遍历每一个成员
map.forEach(function (value, key, map) {
console.log(`这是key:${key},这是value:${value},这是map本身:${map}`);
})
Map在使用过程中需要注意的地方
1.在js中NaN是不等于自身的一种数据类型,但是在map中,多次set以NaN为key的数据的时候,会产生覆盖的行为。说明map会将NaN视为同一个键
map.set(NaN,1).set(NaN,10);
console.log(map);
2.如果map数据中以空对象作为key({})的话,会发现,出现了两个key,这是因为每一个{}都是全新的引用,其不同的是内存地址。而反观上面的NaN,其地址只有一个,所以才会出现覆盖的情况
map.set({},1).set({},2);
console.log(map);