Map 是和 object对象类似的一种数据结构
Map 和 Object 区别
- object 的键名只能为字符串、数字 或者 symbol;Map 的键名类型更丰富,可以是任意类型的,包括对象等
- object 的大小(属性总个数)要通过遍历计算获取;Map 可以直接通过 size 属性获得
- object 中查找是否存在某个属性时,需要使用遍历;Map 可以直接使用 has() 检查是否存在
- object 有原型,自己定义的属性名可能会与原型链上的属性名重复
- 对于频繁的添加、删除属性操作,Map 比 object 的效率更高
Map 的一些操作方法
set()- - -添加属性
get()- - -获取属性值
has()- - -判断是否存在某属性
delete()- - -删除某属性
clear()- - -清除所有属性
示例:
let m = new Map();
let obj = {
uname: '斑'
}
m.set(obj, '猫咪老师')
console.log(m)
console.log(m.get(obj))
console.log(m.size)
let m2 = new Map([['夏目玲子', 18], ['夏目贵志', 16], ['奈落', '妖怪']])
console.log(m2)
console.log(m2.size)
console.log(m2.has('夏目玲子'))
console.log(m2.has('犬夜叉'))
m2.delete('奈落')
console.log(m2)
m2.clear()
console.log(m2)
打印结果:
Map 的遍历
遍历可以和对象一样使用:
forEach()、for of、for of + keys()、for of values()+ 、for of + entries()
let m = new Map([['夏目玲子', 18], ['夏目贵志', 16], ['斑', 10000]])
m.forEach(item => console.log(item))
m.forEach((value, key) => console.log(value, key))
for (let i of m) {
console.log(i)
}
for (let key of m.keys()) {
console.log(key)
}
for (let value of m.values()) {
console.log(value)
}
for (let [key, value] of m.entries()) {
console.log(key, value)
}
打印结果:
Map 的应用场景
对于可以使用 object 的地方,都可以考虑使用 Map
WeakMap
WeakMap 和 Map 类似,但是 WeakMap 只能存放 引用类型 的属性(如对象、数组、方法),属于弱引用,不能遍历- - -无法使用 forEach()、for of、for of + keys()、for of values()+ 、for of + entries() 遍历属性
没有 size 属性
没有 clear() 方法
存放普通属性会报错,eg:
let m = new WeakMap()
m.set('莉萝')
打印结果:
存放对象正确:
let m = new WeakMap()
let obj = {
uname: '史迪仔'
}
m.set(obj, '星际宝贝')
console.log(m)
打印结果: