ES6在很久之前都推出了Map,weakMap,Set,WeakSet这四种新的数据类型,一直看一遍忘一遍,也没有过多的去深入学习,最近有时间,晚上加班学习一下老知识,再来涨涨见识!

五分钟学习ES6数据类型:Map和weakMap-QUI-Notes

Map数据类型

 Map介绍及用法

新增Map属性值,通过关键字set(key,value)进行属性设置,Map的属性key具备唯一性,如果重复,后面的value会把前面的值覆盖!

let aa = new Map()
aa.set("a","213123")
aa.set("b","21322123")
aa.set("c","3123")

属性判断-has 

Map属性是否包含某个属性值?可用使用has关键字,返回布尔值。

属性删除-delete

 Map属性删除是通过delete关键字,删除指定对象的属性值

// 属性判断
if(aa.has('b')){
  // 属性删除
  aa.delete('b')
}

长度获取-size

Map类型的数据长度,不能用length获取,而是使用size,通过关键字size返回数据长度!

let length = aa.size

获取属性值-get

如何获取指定Map的属性值?有人说可用直接遍历数据,再获取对应的属性值。其实Map提供了一个get方法,可用直接获取指定的属性值。

aa.get('c')

迭代属性 

Map数据类型具备迭代器,可用通过keys,values和entries使用Map迭代属性。

let ww = aa.entries()
let dd = aa.keys()
let ee = aa.values()

转数组

Map数据类型可以通过Array.from转数组,它本身是一种类似数组得数据结构。

let bb = Array.from(aa)

Map遍历,得到的是属性对应的值

Map数据类型可用使用forEach进行遍历,换句话说,Map提供了一个forEach的方法,允许遍历子属性。

if(aa){
	aa.forEach(item=>{
		console.log(item)
	})
}

数据类型-Map

既然是一种新得数据类型,那通过Object原型得方法打印一下Map的值,我们看看它最后的值是什么?

console.log(Object.prototype.toString.call(aa)); // [object Map]

很明显,打印的结果是Map,也就是说ES6之后,js的基本数据类型又被扩展了,不单单是原型的基础类型,array,function,object,undefined,null,NaN,现在又要加入Map,WeakMap ,Set,WeakSet这四种。

是否支持序列化

我们知道数组和对象都支持JSON序列化和反序列化,那么Map类型可以序列化嘛?

console.log(JSON.stringify(aa)) // {}

不支持序列化,会得到空对象。

清除数据-clear

Map属性及值的清除,使用clear关键字,将数据全部清除

aa.clear()

WeakMap介绍及用法:

WeakMap用法和方法类似于Map,不过方法没那么多,也没有size属性,WeakMap只有:has,set,get,delete,具体了可以看下面的原型方法对比图,如下:

let wa = new WeakMap()
et b = {
  name:"张三"
}
wa.set(b,"bb")
if(wa.has(b)){
	if(wa.get(b) == 'bb'){
		wa.delete(b)
	}
}

WeakMap和Map数据类型的区别

1.Map支持任意值作为key值;WeakMap的key值只能是对象!!!
2.Map是引用类型;WeakMap是弱引用,内存会被回收!
3.WeakMap没有size长度属性;没有Map的clear方法,WeakMap是内存很快被收回;WeakMap没有Map的迭代器,不能转成数组结构!