Map基本用法
js对象,本质上是键值对的集合(Hash结构),传统上只能用字符串做键值,给使用带来限制;
为了解决之歌问题,es6提供了Mao结构;
类似于对象,也是键值对的集合,但是键值不限于字符串,各种类型都可以做键值。
const m = new Map();
const o = {p: 'Hello World'};
m.set(o, 'content')
m.get(o) // "content"
m.has(o) // true
m.delete(o) // true
m.has(o) // false
代码中使用Map结构的set方法,将对象o当做m的一个键,然后又使用get方法读取这个键,接着使用delete删除了这个键
作为构造函数,Map可以接受数组作为参数。该数组的成员是一个个表示键值对的数组
const map = new Map([
['name', '张三'],
['title', 'Author']
]);
map.size // 2
map.has('name') // true
map.get('name') // "张三"
map.has('title') // true
map.get('title') // "Author"
Map构造函数接受数组作为参数,实际上执行的是下面的算法。
const items = [
['name', '张三'],
['title', 'Author']
];
const map = new Map();
items.forEach(
([key, value]) => map.set(key, value)
);
实例属性和方法
1.size: 返回Map结构成员总数
2.set(key, value) : 设置键名key对应的键值为value,返回整个Map结构,如果存在key,更新键值
3.get(key): 读取key对应键值,如果没有返回undefined
4.has(key):返回一个布尔值,表示是否在当前Map对象中
5.delete(key): 删除某个键,删除成功返回true,失败false
6.clear(): 清除掉所有成员,没有返回值
遍历方法
1.keys()
2.values()
3.entries()
4.forEach()
遍历的就是插入顺序
Map与其他数据类型装换
1.map转数组
var map = new Map([
['a','A']
]);
var a = [...map];
2.数组转map
将数组传入 Map 构造函数,就可以转为 Map
new Map([
[true, 7],
[{foo: 3}, ['abc']]
])
3.Map转对象
如果所有Map键值都是字符串,可以无损转为对象
如果如果有非字符串的键名,那么这个键名会被转成字符串,再作为对象的键名
遍历Map给对象赋值即可
4.对象转map
遍历对象给map赋值
var a = {
x:1,
y:2
}
var map = new Map()
for(let i in a){
map.set(i,a[i])
}
// Map(2) {"x" => 1, "y" => 2}
weakMap
和Map两个区别:
1.只接受Object作为键名
const map = new WeakMap();
map.set(1, 2)
// TypeError: 1 is not an object!
map.set(Symbol(), 2)
// TypeError: Invalid value used as weak map key
map.set(null, 2)
// TypeError: Invalid value used as weak map key
2.键名所指向的对象,弱引用,不计入垃圾回收机制
只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。
也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用
api上的区别: 没有遍历操作,没有size属性
使用场景:DOM节点作为键名
网友评论