ES6学习day04:Set和Map数据结构

Set和Map是常用的数据结构,在python中Set是集合,包含的元素不允许重复。Map用于映射。JavaScript中没有Set和Map数据结构,在ES6中才引入。

1.Set

1.Set用法

  • Set类似于数组,其本身是一个构造函数,用来生成Set数据结构。它的成员元素的值没有重复的,都是唯一的,因此可以用于数组的去重。

  • 使用add()方法向Set结构添加成员。

    针对上面1和2,下面的代码帮助理解:

    //Set本身是一个构造函数,用来生成Set数据结构
    let arr=new Set();
    [1,2,5,2,3,6].forEach(x=>arr.add(x));
    console.log(arr);//Set(5) {1, 2, 5, 3, 6}
    //使用for...of 循环遍历set
    for (let i of arr) {
    	console.log(i);//1,2,5,3,6
    }
    
  • Set可以接受一个数组或者具有Iterable借接口的其他数据结构作为参数,用于初始化。

    3.1 Set函数接受数组作为参数

    //Set函数接受数组作为参数
    arr=new Set([1,2,5,2,3,6])
    console.log(arr);//Set(5) {1, 2, 5, 3, 6}
    console.log(arr.size);//5
    

    3.2 Set函数接受类似数组的对象作为参数

    //Set函数接受类似数组的对象作为参数
    <div>
    	<h1>test1</h1>
    	<h1>test2</h1>
    </div>
    const set=new Set(document.querySelectorAll('div'));
    console.log(set.size);//1 返回div的个数
    
  • Set判断两个值是否相等的特殊点(NaN,null,{})

    向Set加入值的时候不会发生类型转换,所以数字2和字符串’2’是两个不同的值。

    Set内部判断两个值是否相等,类似全等于(===)。与全等于的主要的区别是Set认为NaN等于自身,而'==='运算符认为NaN不等于自身。

    4.1 在Set内部,两个NaN是相等的

    //在Set内部,两个NaN是相等的
    let arr=new Set();
    let a = NaN;
    let b = NaN;
    arr.add(a);
    arr.add(b);
    console.log(arr);//Set(1) {NaN},只加入一个NaN
    

    4.2 两个对象总是不相等的

    //两个对象总是不相等的
    let arr=new Set();
    //添加一个空对象
    arr.add({});
    arr.add({});
    console.log(arr);//Set(2) {Object{},Object{}}
    console.log(arr.size);//2,两个空对象不相等,被视为两个值
    

2.Set实例的属性

  • 1.Set.prototype.constructor:构造函数,默认为Set函数。

  • 2.Set.prototype.size:返回Set实例的成员总数。

3.Set实例的方法

3.1 操作数据的方法

  • 1.add(value):添加成员,返回Set结构本身。

  • 2.delete(value):删除某成员,返回布尔值。表示是否成功删除。

  • 3.has(value):返回布尔值,判断Set成员中是否含有该值。

  • 4.clear():清除所有成员,无返回值。

3.2 遍历方法

  • 1.keys():返回键名的遍历器。

  • 2.values():返回值的遍历器。

  • 3.entries():返回键值的遍历器。

  • forEach():使用回调函数遍历每个成员。

实例方法的使用例如:

在这里插入图片描述

3.3 Array.from方法可以将Set结构转为数组。

例如:

在这里插入图片描述

【注意】:

Set结构没有键名,只有键值(键名和键值是同一个值)。所以keys()和values()方法的行为完全一样,所以也可以省略values()方法,直接使用for…of方法循环遍历set。

2.WeakSet

WeakSet结构与Set结构类似,也是一种值不会重复的集合。

二者的区别如下:

  • 1.WeakSet的成员只能是对象,不能是其他类型的值。

  • 2.WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用。因此WeakSet的成员不适合引用,因为它会随时消失。

WeakSet语法:

const ws = new WeakSet();

3.Map结构

Map数据结构类似于对象,是键值对的集合,但是键的范围不像Object结构仅限于字符串,Map结构各种类型的值(包括对象)都可以当做键。

1. Map用法

Map结构用法同Set结构,使用new Map生成Map结构。如下:

在这里插入图片描述

综合用例如下:
在这里插入图片描述

2. Map结构方法

Map结构操作数据的方法如上面例子中使用。

遍历方法同Set结构。

Map 结构原生提供三个遍历器生成函数和一个遍历方法。

  • keys():返回键名的遍历器。

  • values():返回键值的遍历器。

  • entries():返回所有成员的遍历器。

  • forEach():遍历 Map 的所有成员。

    需要特别注意的是,Map 的遍历顺序就是插入顺序。

3. Map结构核心记忆点

  • 3.1 Map构造函数接受数组为参数

    在这里插入图片描述

  • 3.2 对同一个键多次赋值,后面的值将覆盖前面的值

    在这里插入图片描述

  • 3.2 读取一个未知的键,返回undefined

    在这里插入图片描述

  • 3.3 Map的键实际是跟内存地址绑定的,只要内存地址不一样,就视为两个键。

    在这里插入图片描述
    例一:

    //Map的键实际是跟内存地址绑定的,只要内存地址不一样,就视为两个键。
    const map=new Map();
    map.set(['key'],111);
    var getkay=map.get(['key']);
    console.log(getkay);//undefined
    
    //同样的值的两个实例,在Map结构中被视为两个键
    const key1=['key'];
    const key2=['key'];
    map.set(key1,111);
    map.set(key2,222);
    console.log(map.get(key1));//111
    console.log(map.get(key2));//222
    
  • 3.4 如果 Map的键是一个简单类型的值,如数字、字符串和布尔值。只要两个值严格相等, Map结构就把它视为一个键。

    【特别注意】

    • 0和-0就是同一个键。(其余数字正负值不严格相等,如1和-1不是同一个键)

    • 布尔值true和字符串’true’也是两个不同的键。

    • undefined和null也是两个不同的键。

    • NaN不严格等于自身,但是Map将其视为同一个键。

4.WeakMap

WeakMap结构与Map结构类似,用于生成键值对的集合。

  1. WeakMap结构语法:

    const wm = new WeakMap();
    
  2. WeakMap与Map的主要区别

    2.1. WeakMap只接收对象作为键名(null除外),不接收其他类型的值作为键名。

    2.2 WeakMap的键名所指向的对象不计入垃圾回收机制。

从此天涯是你,明月是你,就是喜欢你。哈哈,每天进步一点点。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值