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结构类似,用于生成键值对的集合。
-
WeakMap结构语法:
const wm = new WeakMap();
-
WeakMap与Map的主要区别
2.1. WeakMap只接收对象作为键名(null除外),不接收其他类型的值作为键名。
2.2 WeakMap的键名所指向的对象不计入垃圾回收机制。
从此天涯是你,明月是你,就是喜欢你。哈哈,每天进步一点点。