ES6新增的Set、WeakSet 、Map、WeakMap数据结构

亦凉 2023-08-17 15:42 202阅读 0赞

ES6中新增了内置引用类型:Set、WeakSet 、Map、WeakMap ,他们都是数据结构,数据结构是指相互之间存在特定关系的数据元素的集合。
其中Set和Map提供了iterator接口,可以遍历。

Set数据结构

Set是一种类似数组的数据结构,是不重复的集合。
通过new Set()可以声明一个Set对象实例,new Set()接受一个数组(或类数组的对象)作为参数,用来初始化。
在这里插入图片描述

  1. let arr=[1,2,3,3]; //(4) [1, 2, 3, 3]
  2. let set=new Set(arr);
  3. console.log(arr); //[1, 2, 3, 3]
  4. console.log(set); //Set(3) {1, 2, 3}
  5. console.log(set.size); //3 size属性返回Set实例的成员总数
  6. set.add(4); //add() 用于向Set中添加元素
  7. set.delete(1); //delete() 用于从Set中删除元素
  8. console.log(set.has(1)); //false has() 用于判断某元素是否存在
  9. console.log(set); //Set(3) {2, 3, 4}
  10. set.add({ a:1}); //Set 添加任意类型的元素
  11. set.add({ a:1}); //两个相同的对象不相等,不会去重,set中NaN只能有一个
  12. console.log(set); //Set(5) {2, 3, 4, {…}, {…}}
  13. console.log([...set]) //转为数组(5) [2, 3, 4, {…}, {…}]
  14. set.clear(); //clear() 用于清除所有元素
  15. console.log(set); //Set(0) {}

Set 结构的遍历:

Set的原型中有keys方法、vaules方法、entries方法,返回的都是Set遍历器对象(SetIterator),可以通过for of遍历。
由于Set 结构的键名和键值是同一个值),所以keys方法和vaules方法的行为完全一致。entries方法返回的成员是以一组键值对的结构。

  1. let set=new Set(['a','b','c']);
  2. console.log(set.keys()); // SetIterator {"a", "b", "c"} keys()获取Set的所有key
  3. console.log(set.values()); // SetIterator {"a", "b", "c"} values()获取Set的所有value
  4. console.log(set.entries()); // SetIterator {"a" => "a", "b" => "b", "c" => "c"} entries()获取Set所有成员
  5. for(let key of set.keys()){
  6. console.log(key);
  7. }
  8. for(let value of set.values()){
  9. console.log(value);
  10. }
  11. for(let [key,value] of set.entries()){
  12. console.log(key+':'+value);
  13. }

也可以用forEach进行遍历

  1. let set=new Set(['a','b','c']);
  2. set.forEach(function(value,key){
  3. console.log(value,key)
  4. });

WeakSet数据结构

WeakSet数据结构与Set类似,也是不重复的集合,字面意思是弱Set,Set中添加任意类型的元素,但Set中对象的引用都是强类型化的,并不会允许垃圾回收,ES6还引入了WeakSet的弱集合,WeakSet只能存储对象作为成员,允许从内存中清除不再需要的被这些集合所引用的对象。

  • WeakSet的成员只能是对象
  • WeakSet中的对象都是弱引用
    如果一个对象是WeakSet集合的成员,而其他对象都不再引用该对象,那么该对象将会被垃圾回收机制回收
  • WeakSet集合不可遍历

    let s=new Set();
    let ws=new WeakSet();

    s.add([1,2,3]);
    ws.add([1,2,3]);
    console.log(s); //Set(1) {Array(3)}
    console.log(ws); //WeakSet {Array(3)}
    //10秒后ws中的成员被回收
    setTimeout(function () {

    1. console.log(s); //Set(1) {Array(3)}
    2. console.log(ws); //WeakSet {}

    },10000);

在这里插入图片描述
WeakSet的三个方法add(),delete(),has()参考Set实例对象的方法。

Map数据结构

如果说Set类似数组,那么Map比较类似对象,Map集合中的成员是以一组键值对的结构, 这和Object对象一样,但Object对象的键名要求是字符串或Symbol,而Map成员的键名可以是任何类型的值。

  • 初始化Map需要一个二维数组,或者直接初始化一个空Map
  • set( )方法给实例设置一对键值对。
  • 对一个key重复赋值时,会进行覆盖

    //创建实例并初始化,参数是一个数组,数组的成员是键值对形式的数组
    var m1=new Map([

    1. ['id', 1],
    2. [2, 2],
    3. [{ }, 3]

    ]);
    console.log(m1);
    var m2 = new Map();
    m2.set(‘id’, 1);
    m2.set(2, 2);
    m2.set({ }, 3);
    console.log(m2);

在这里插入图片描述

Map 结构的遍历:

同Set一样,Map的原型中有keys方法、vaules方法、entries方法,返回的都是Map遍历器对象(SetIterator),可以通过for of遍历。keys()获取Map实例的键名,values()获取Map实例的键值,entries()获取Map实例的键值对。

  1. let m=new Map();
  2. m.set("id",1);
  3. m.set("name",'Lily');
  4. m.set("age",18);
  5. console.log(m); //
  6. console.log(m.keys()); // MapIterator {"id", "name", "age"} keys()获取Map实例的所有key
  7. console.log(m.values()); // MapIterator {1, "Lily", 18} values()获取Map实例的所有value
  8. console.log(m.entries()); // MapIterator {"id" => 1, "name" => "Lily", "age" => 18} entries()获取Map实例的键值对
  9. for(let key of m.keys()){
  10. console.log(key);
  11. }
  12. for(let value of m.values()){
  13. console.log(value);
  14. }
  15. for(let [key,value] of m.entries()){
  16. console.log(key+':'+value);
  17. }

也可以用forEach进行遍历

  1. m.forEach(function(value,key){
  2. console.log(key+':'+value);
  3. });

WeakMap结构

  • WeakMap结构同Map类似,但Map结构中键名可以是任何类型的值,而WeakMap结构中的键名必须是引用类型。
  • WeakMap结构与WeakSet结构相似,WeakMap集合不可遍历
  • WeakMap是弱集合,允许被垃圾回收机制回收
  • WeakMap的4个方法set(),add(),delete(),has()
    在这里插入图片描述

    let wm=new WeakMap();
    wm.set({ },1);
    console.log(wm); //WeakMap { {…} => 1}
    //10秒后ws中的成员被回收
    setTimeout(function () {

    1. console.log(wm); //WeakMap {}

    },10000);

发表评论

表情:
评论列表 (有 0 条评论,202人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ES6新增内容

    ES6的新增内容 关于let 和const变量的申明 let申明的变量不存在预解析 let声明不允许变量的重复 es6引入了块作用域,在块作用域内let和c

    相关 ES6新增内容

    1、map、filter和reduce的区别 map 作用是生成一个新数组,遍历原数组,将每个元素拿出来做一些变换然后放入到新的数组中。map 的回调函数接受三个参数,分

    相关 ES6新增循环

    1、以前for循环,for in循环 2、ES6新增循环:for of 循环:遍历(迭代,循环)整个对象, 两者的区别: for in循环:既可以循环数组,