set
简介
- set类似于数组,但成员值都是唯一的
- set函数可接受数组作为参数,不会添加重复值
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5, 6]);
items //1,2,3,4,5,6
- 去除数组的重复成员
[…new Set(array)] - Set中加入值时不会发生类型转换 (5和”5”不同)
Set内部判断两个值是否相等类似于(===)但NaN等于自身,(===)中认为NaN不等于自身
两个对象总是不相等的,两个空对象会被认作两个值 - Set 结构没有键名,只有键值
Set实例的属性和方法
- 属性
Set.prototype.constructor:构造函数,默认就是Set函数。
Set.prototype.size:返回Set实例的成员总数。 - 方法
add(value):添加某个值,返回Set结构本身。
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。 - 判断是否包含一个键
对象:
if (properties[someName]) {
// do something
}
set:
if (properties.has(someName)) {
// do something
}
- Array.from可以将Set结构转为数组(可去除数组重复成员)
遍历操作
- 方法
- keys():返回键名的遍历器
- values():返回键值的遍历器
- entries():返回键值对的遍历器
- forEach():使用回调函数遍历每个成员,没有返回值
- 没有键名,只有键值,keys()与values()返回值相同,可直接循环
let set = new Set(['red', 'green', 'blue']);
for (let x of set) {
console.log(x);
}
应用
- 与扩展运算符和filter结合,实现并集,交集,差集
- 在遍历操作中直接改变set结构
// 方法一
let set = new Set([1, 2, 3]);
set = new Set([...set].map(val => val * 2));
// set的值是2, 4, 6
// 方法二
let set = new Set([1, 2, 3]);
set = new Set(Array.from(set, val => val * 2));
// set的值是2, 4, 6
WeakSet
- 类似Set ,不重复的值的集合
- 但是WeakSet 的成员只能是对象
- WeakSet中的对象都是弱引用,适合临时存放对象
- 内部对象数量不可预测,所以WeakSet不可遍历
- 方法
- WeakSet.prototype.add(value):向 WeakSet 实例添加一个新成员。
- WeakSet.prototype.delete(value):清除 WeakSet 实例的指定成员。
- WeakSet.prototype.has(value):返回一个布尔值,表示某个值是否在 WeakSet 实例之中。
Map
简介
- 也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键
- 同一键值多次赋值,后者覆盖前者
- Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键
方法
- 方法&属性
- set() 添加成员,map.set(key, value)
- get() 读取成员,读取未知的键,返回undefined
- has() 是否含有某成员
- delete() 删除成员
- size属性 返回成员总数
- clear() 清除所有成员
遍历
keys(),values(),entries(),forEach()
1. Map 的遍历顺序就是插入顺序
2. 可使用扩展运算符转换为数组
3. Map 本身没有map和filter方法,可以结合数组的map方法实现
与其他数据类型相互转换
其他
- 垃圾回收机制
- 内存泄漏