我们知道 js 里面的object ,只能用字符串当作键,这给我们开发中带来了很大的限制,于是Map 俨然而生。
Map , 它类似于对象,也是一种键值队的数据结构,但是但是“键”的范围不限于字符串,各种类型的值(包括对象,数组,函数)都可以当作键。
map 的定义:
let map = new Map();
let map = new Map([[key,value],[key,value]]); //默认带初始化参数的定义
给map设置任何类型的键,皆可。
var map = new Map() //定义一个空的map
let obj = {name:1};
map.set(true,'111');
map.set(obj,'111');Ï
console.log(map)
map的实例属性和方法
size、set、get、has、delete、clear
1. size
//size
var obj = new Map([['name', 'andy'], ['age', 18], ['sex', '女']])
obj.size //3
2. set ( key , value )和get (key) // get如果找不到 key,返回 undefined。
let map = new Map()
obj.set("name", '小小')
obj.get('name') // 小小
obj.get('age') // undefined
//set方法返回的是Map本身,也可以采用链式写法。
let map = new Map()
.set('name', '旺财')
.set('age',18')
.set('sex', '男');
注意,只有对同一个对象的引用,Map结构才将其视为同一个键。
例如:
let map = new Map();
map.set(['1'],111);
map.get(['1']) // undefined
['1']===['1'] // false
上面代码的 set 和 get 方法,表面是针对同一个键,但实际上这是两个值,内存地址是不一样的,因此 get 方法无法读取该键,返回 undefined。
var obj = new Map()
obj.set("name", '旺财')
obj.get('name') // 旺财
上面代码的set和get方法,针对的是同一个值,所以可以get读取到这个值,这就涉及到存储方面的知识了,是直接存储值还是存储的是内存地址。
let map = new Map();
let keyObj = {};
let keyFunc = function() {};
let keyString = 'a string';
// 添加键
map.set(keyString, "和键'a string'关联的值");
map.set(keyObj, "和键keyObj关联的值");
map.set(keyFunc, "和键keyFunc关联的值");
// 读取值
map.get(keyString); // "和键'a string'关联的值"
map.get(keyObj); // "和键keyObj关联的值"
map.get(keyFunc); // "和键keyFunc关联的值"
map.get('a string'); // "和键'a string'关联的值"
// 因为keyString === 'a string'
map.get({}); // undefined, 因为keyObj !== {}
map.get(function() {}); // undefined, 因为keyFunc !== function () {}
3. has(key) 返回一个布尔值,表示是否存在。
let map = new Map()
obj.set("name", '旺财')
obj.has('name') // true
obj.has('age') // false
4. delete(key) 删除某个键。
let map = new Map()
obj.set("name", '旺财')
obj.delete('name')
obj.has('name') // false
5. clear() 清除所有成员,没有返回值。
var obj = new Map()
obj.set("name", '旺财')
obj.size // 1
obj.clear()
obj.size // 0