一 基础信息
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