Set和Map数据结构SetWeakSetMapWeakMap1.Set类似于一个数组,其成员值是唯一的。Set本身是一个构造函数,用来生成一个Set数据结构lets=newSet([1])console.log(s);在Set中可以接受其他具有可迭代接口的数据结构可以使用[...newSet(arr)]数组去重Array.from(newSet(arr))也可以设置属性构造函数sizelets=newSet([1,2])console.dir(s.__proto__.constructor===Set.prototype.constructor);//trueconsole.log(s.size)//2size表示成员个数,类似length属性的方法一个数组的Set操作方法:adddelete有明确的遍历方法:valueskeysentriesforEach1-操作方法add(value)addvalue,返回Set本身lets=newSet([1,2])lets1=s。add(3)console.log(s,s1);detele(value)删除值,返回布尔值,确认删除成功lets=newSet([1,2])lets1=s.delete(1)console.log(s,s1);has(value)返回一个布尔值判断是否存在某个值,类似于数组includelets=newSet([1,2])lets1=s.has(2)console.log(s,s1);clear()清空所有Member,无返回值lets=newSet([1,2])lets1=s.clear()console.log(s,s1);2-遍历方法keys()返回键名遍历器lets=newSet([1,2,"a","b"])lets1=s.keys()console.log(s1);for(constiofs1){console.log(i);}values()返回一个键值遍历器lets=newSet([1,2,"a","b"])lets1=s.valuees()console.log(s1);for(constiofs1){console.log(i);}可以看出key和value遍历的values是相同的entries()返回key-值对lets=newSet([1,2,"a","b"])lets1=s.entries()console.log(s1);for(constiofs1){console.log(i);}forEach()使用回调函数遍历每个成员,无返回值lets=newSet([1,2,3,4])s.forEach(x=>{console.log(x*2);//2468})2.WeakSetWeakSet的成员只能是对象,否则会报错lets=newWeakSet([1,2,3,4])console.log(s);WeakSet中的对象是弱引用,没有size属性无法遍历方法:adddeletehasletobj={a:1}lets=newWeakSet([[0],[1]])s.add(obj)console。日志;3.Map键值对集合,key可以是对象,比较完整的Hash结构Map构造函数constset=newSet([["a",1],["b",2]])constmap=new地图(设置)console.log(地图);Map可以接收具有Iterator接口的数据结构,每个成员都是一个二元数组。Map上还有一个size属性,表示成员的数量。Map的键绑定到内存。内存不同则视为两个Key,NaN视为同一个keyMap方法操作方法:setgethasdeleteclear遍历方法keysvaluesentriesforEach1-操作方法set(key,value)get(key)添加成员获取值返回Mapconstmap=newMap()map.set("a",1)console.log(map);console.log(map.get("a"));has(key)返回a布尔值,一个key是否在Map中constmap=newMap([["a",1]])letm1=map.has("a")console.log(map,m1);delete(key)删除一个key,returnbooleanconstmap=newMap([["a",1],["b",2]])letm1=map.delete("a")console.log(map,m1);clear()清除所有成员,无返回值constmap=newMap([["a",1],["b",2]])letm1=map.clear()console.log(map,m1);2-遍历方法keys()返回键名遍历器values()返回的迭代器keyvalueentries()返回键值对的迭代器forEach(callback,thisArg)遍历Map的所有成员遍历方式和Set的大致相同,不再举例说明for(let[key,value]ofmap)等同于使用map.entries(),同样的entries遍历器也可以赋值给这样两个参数Map等数据结构转换数组对象JSON1.Map和数组转换Maptoarrayextenderoperationconstmap=newMap([["a",1],["b",2]])console.log([...map]);//[["a",1],["b",2]]ArraytoMap只写数组intoMap构造函数letmap=newMap(["a",0],[{"b":true},2])console.log(map);2.MapMap到对象Map的所有键都是字符串,可以转化为对象functiontoObj(map){letobj=Object.create(null)for(let[k,v]ofmap){obj[k]=v}returnobj}//遍历map并赋值将键值一一对应到一个对象letmap=newMap([["a",1],["b",2]])console.log(toObj(map));//{"a":1、"b":2}对象为Map遍历对象,以set的方式为Map添??加键值对函数objToMap(obj){letmap=newMap()for(letkofObject.keys(obj)){map.set(k,obj[k])}returnmap}letobj={a:1,b:2}console.log(objToMap(obj));//{"a"=>1,"b"=>2}3.Map和JSON的转换Map到对象JSONMap的键是字符串functiontoObj(map){letobj=Object.create(null)for(let[k,v]ofmap){obj[k]=v}returnobj}functiontoObjJson(map){returnJSON.stringify(toObj(map))}letmap=newMap([["a",1],["b",2]])console.log(toObjJson(map));//'{"a":1,"b":2}'先将Map转为对象,然后使用JSON将Map序列化为数组。JSONMap中的键名有一个非字符串函数toObjJson(map){returnJSON.stringify([...map])}letmap=newMap([[true,1],[false,0]])console.log(toObjJson(map));//'[[true,1],[false,0]]'先将Map转换成数组,然后使用JSON序列化对象JSONtoMapkeynameisastringfunctionobjToMap(obj){letmap=newMap()for(letkofObject.keys(obj)){map.set(k,obj[k])}returnmap}functionjsonToStrMap(json){returnobjToMap(JSON.parse(json))}letjson='{"a":1,"b":2}'console.log(jsonToStrMap(json));//{"a"=>1,"b"=>2}先把json反序列化成对象,然后把对象转成Map数组JSON转成MapJSON本身就是一个数组,每个成员都是一个数组,包含两个元素functionjsonToMap(json){returnnewMap(JSON.parse(json))}letjson='[[true,1],[false,0]]'console.log(jsonToMap(json));//{true=>1,false=>0}先将JSON反序列化成数组,再将数组转成Map4。WeakMap在结构上类似于Map,也是键值对的集合。WeakMap只接受对象作为键名指向的键对象,不包括在垃圾回收机制中。与WeakSet类似,对象引用都是弱引用。没有大小属性??操作。没有遍历操作,也就是没有keyvaluesentriesforEach。这些方法的键名都是引用的,以防不确定,所以统一规定键名不可取回,不可清除。没有明确的方法可用。方法setgethasdelete适用于使用DOM节点作为WeakMap的键。
