Set和Map数据结构
一、Set:
它本身是一个构造函数,用来生成Set数据结构。类似于数组的一种形式。
特点:
1、不会添加重复的值,例如:
var set = new Set([1,2,3,4,4,4,5]); console.log([...set]); // 1.2.3.4.5
2、通过add(value),添加某个值;
通过delete(value),删除某个值;
通过has(value),判断该参数是否为Set的成员;
通过clear(),清楚所有Set成员;
var set = new Set(); set.add("HJT"); set.add("TYY"); console.log([...set]); // HJT TYY set.delete("HJT"); console.log([...set]); // TYY set.has("HJT"); // flase set.has("TYY"); // true set.clear(); set.has("TYY"); // false
3、遍历操作:keys():返回一个键名
values():返回键值
entries():返回一个键值对
forEach():遍历每个成员
var set = new Set(['a','b','c','d','e','f']); for(let x of set.keys()){ console.log(x); // a b c d e f } // 由于Set数组结构,键值和键名都是同一个值,所以输出是相同的值 for(let x of set.values()){ console.log(x); // a b c d e f } // 使用entries()方法,便是返回两个相同键值对 for(let x of set.entries()){ console.log(x); // ["a","a"] ["b","b"] ["c","c"] ["d","d"]...... }
WeakSet结构,与Set结构有两个区别
1、成员只能是对象,不能是其他类型
2、弱引用对象,当其他地方不再引用该对象后,这个对象会自动被垃圾回收机制给回收掉,因此不可遍历。
二、Map:
与Set结构类似,但是不同的是,Map的结构,键值和键名是不同的,可以一 一对应。
1、特点:
var map = new Map(); // set方法添加成员 map.set('HJT',"shmily"); map.set('TYY',"emily"); // size属性获取长度 map.size // 2 // get方法读取相应key的键值 map.get("HJT"); // shmily //has判断该成员是否存在Map数据结构中 map.has("TYY"); // true map.has("AAA"); // flase //delete删除某个成员 map.delete("TYY"); map.has("TYY"); // flase // clear清除所有的成员 map.clear(); map.has("HJT"); // flase
2、与各类型相互转化
var map = new Map(); map.set('HJT',"shmily"); map.set('TYY',"emily"); // Map转为数组,使用扩展运算符[...] [...map] // 数组转为Map,new Map(这里是一个数组) new Map([...map]); //Map转为对象,封装一个strMapToObj的方法 function strMapToObj(strMap){ let obj = Object.create(null); for(let [k,v] of strMap){ obj[k] = v; } return obj; } strMapToObj(map); // 对象转为Map数据结构,封装一个strObjToMap的方法 function strObjToMap(obj){ let strMap = new Map(); for(let k of Object.keys(obj)){ strMap.set(k,obj[k]); } return strMap; } strObjToMap(某个对象); // Map转为Json,利用strMapToObj(strMap)方法 function strMapToJson(strMap){ return JSON.stringify(strMapToObj(strMap)); } strMapToJson(map); // Json转为Map结构,利用strObjToMap(obj)方法 function strJsonToMap(obj){ return JSON.parse(strObjToMap(obj)); } strJsonToMap(某个对象);
WeakMap结构与Map结构类似,但是只能接受对象作为键名,不接受其他类型的键名(MapSet也是如此),是弱对象引用,常用来防止内存泄漏,当网页中的一个DOM节点绑定了在WeakMap中时,DOM结构在网页中被清除后,WeakMap中相应的成员也会自动被JS回收机制给清除。例如:
var a = docunment.getElementById('a'); var weakMap = new WeakMap(); weakMap.set(a,"xxxxxx"); weakMap.get(a); // xxxxxx a.parentNode.removeChild(a); weakMap.get(a); // undefined