1、set
1.1 set集合概念:
- 一个无 重复元素的列表
- 主要应用场景:检测给定值的某个集合是否存在
1.2 如何使用set
set的特性
1、不会对存值强制类型转换
2、多次调用add方法并传入相同的值作为参数,后续调用将被忽略
3、可用数组初始化Set集合,会过滤重复值,保证集合元素唯一
注意:
Set构造函数可接受所有可迭代的对象作为参数,数组、set集合、map集合都是可迭代的
1.2 set的方法和属性
- 创建set集合 new Set()
- 向集合中添加数据 set.add()
- size属性获取集合元素数量 set.size
- has() 检测Set集合是否存在某个值
- delete() 移除Set集合中某一个元素
- clear() 一处集合中所有元素
forEach方法
forEach回调函数接收3个参数
- set集合中下一个索引的位置
- 与第一个参数一样的值
- 被遍历的set集合本身
forEach方法第二个参数与数组一样,需要在回调函数中使用this,可将它作为第二个参数传入forEach方法
若使用箭头函数,无需将this作为参数传入回调。
set集合与数组互相转换
数组转set
let set = new Set([1,2,3])
set 转数组
array = [...set]
set的主要应用场景:
1、数组过滤重复值,最后输出无重复的新数组
2、判断数组有没存在某个值(检测给定值的某个集合是否存在)
去重数组案例
var set = new Set([1,2,3,4,5,5,6,7,7]);
function eliminateDuplicates(items){
return [...new Set(items)]
}
var numbers = [1,2,3,4,5,5,6,7,7],
noDuplicates = eliminateDuplicates(numbers);
console.logg(noDuplicates)
//[1,2,3,4,5,6,7]
2、weakSet
2.1 weakSet集合概念:
为什么要用weakSet:
因为:
Set和变量一样是:强引用类型,将变量Key设置为null时,清除了对象的初始引用,但set依然保存着这个引用,可以通过集合转数组的方式取回这个引用。
存在内存泄漏的情景,例如:
web页面通过js代码,记录dom元素,当一段js代码清除了这个dom元素,而你又不希望自己的代码保留这些DOM元素的最后一个引用
什么是weakSet
弱引用set集合,weakSet只存储对象的弱引用,并且不可存储原始值;集合中弱引用如果四对象的唯一引用,则会被回收并释放相应的内存
2.2 weakSet的方法和属性
- 创建weakSet集合 new weakSet()
- 向集合中添加对象 weakset.add(key)
* size属性获取集合元素数量 set.size
- has() 检测weakSet集合是否存在某个值
- delete() 移除weakSet集合中某一个元素
也可以调用WeakSet构造函数并传入一个可以迭代对象来创建Weak Set集合
let key1={},
key2 ={};
set = new WeakSet([key1,key2])
注意:
WeakSet构造函数不接收任何原始值,如果数组中包含其他非对象值,程序报错
2.3 weakSet和set的差别
- weakSet的add方法传入非对象值,程序报错,而向has()和delete()方法传入非对象参数返回false
- weakSet集合不可以迭代
- 不支持forEach()方法
- 不支持size属性
2.4 weakSet的主要应用场景
如果只需跟踪对象的引用,更应该使用weakSet而不是set
3、map
3.1 map集合概念:
为什么要用map:
Set类型可以用来处理列表中的值,但是不适用于处理键值对这样的信息结构
什么是map
- 集合内含多组键值对的有序列表,其中键名对于的值支持所有数据类型
- 主要应用场景:缓存 频繁取用的数据,获取已存的信息
3.2 如何使用map
3.2 map的方法和属性
- 创建map集合 new Map()
- 向集合中添加数据 mep.set()分别传入键名和对应的值作为两个参数
- mep.get()传入键名。如果集合中不存在返回undefined
- size属性获取集合元素数量 set.size
- has() 检测Set集合是否存在某个值
- delete() 移除Set集合中某一个元素
- clear() 一处集合中所有元素
3.2 map集合的初始化方法
可以Map构造函数传入数组来初始化Map集合,数组中每一个元素都是子数组,子数组包含一个键值对的键名与值俩个元素
let map = new Map([["name","lili"],["age",25]])
forEach方法
forEach回调函数接收3个参数
- map集合中下一个索引的位置
- 值对应的键名
- 被遍历的map集合本身
forEach方法第二个参数与数组一样,需要在回调函数中使用this,可将它作为第二个参数传入forEach方法
若使用箭头函数,无需将this作为参数传入回调。
map的主要应用场景:
1、缓存 频繁取用的数据,获取已存的信息(set,get)
2、在对象中无法用对象作为对象属性键名,在map集合可以,有了这个方法之后可以不需要修改对象本身就可以为其添加一些附加信息
let map = new Map(),
key1 = {},
key2 ={};
map.set(key1,5);
map.set(key2,"hhhhhh");
console.log(map.get(key1))//5
4、weakMap
1、存储对象的弱引用
2、WeakMap类型存储着许多键值对的无需列表,列表的键名必须时非NULL类型的对象
通过set方法添加数据。get方法获取数据
3.2 如何使用weakMap
3.2 weakMap的方法和属性
支持has()和delete()方法
不支持clear()和forEach的方法和size属性
只要应用场景:
1存储DOM元素
2、私有对象数据
补充 ES5用对象模拟set集合和map集合
存在以下限制:
- 对象属性必须是字符串
- 对象作为属性名存在问题
- 属性值是假值
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。