前言
小伙伴们大家好。前面我们已经对Set、WeakSet、Map、WeakMap四种数据结构的特点及用法分别做了分享和介绍。为了让小伙伴们能够更直接的理解4种数据结构的异同,本篇文章将会对这四种数据结构的特点做一个统一的汇总和对比。
特点
- Set
- Set本质是构造函数,可接收一个数组(或者具有 iterable 接口的其他数据结构)作为参数用来初始化Set
- Set中的值可以是任意类型的,但必须不能重复,所有值都是唯一的,因此可以用来进行数组去重使用
- Set中认为NaN和NaN是同一个值,因此Set中只能有一个NaN值
- Set中两个对象永远是不相等的,即使键和值都是一样的
- Set也可以为字符串去重
- 在向Set添加值的时候不会发生类型转换,因此“5”和5是两个值
- Set 是可遍历的
- WeakSet
- WeakSet是构造函数,可接收一个值为对象的数组(或者具有 iterable 接口的其他数据结构)作为参数用来初始化WeakSet
- WeakSet的值只能是对象类型,不能是其它类型(基本数据类型)
- WeakSet没有size属性,不能被遍历
- WeakSet中的值也是不能重复的,跟Set一样WeakSet中两个对象永远是不相等的,即使键和值都是一样的
- WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。
- Map
- Map是键值对的集合,键值不限于字符串,可以是任意数据类型
- Map通过set方法添加成员,通过get方法来获取成员
- Map也是构造函数,也可以接受一个数组作为参数,但该数组的成员也必须是一个个表示键值对的数组。例如:[[“name”,“Alvin”],[“age”,18]]
- 不仅仅是数组,任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作Map构造函数的参数。包括Set和Map本身。
- 如果对同一个键多次赋值,后面的值将覆盖前面的值
- 如果读取一个不存在的键则返回undefined
- 只有对同一对象的引用,Map才会视为同一个键。也就是说两个对象的内存地址是一样的,才会被视为是同一个键。(Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键)
- 如果Map的键值是一个基本类型(数字,字符串,布尔等),则只要两个值严格相等(类型和值都相等)才算是同一个键,如0和-0就是同一键,而true和"true"则是两个键
- undefined 和 null是两个不同的键
- NaN在Map中被视为同一个键
- WeakMap
- WeakMap与Map一样也是使用 set 方法添加成员 get方法获取成员
- WeakMap也是一个构造函数,也可以接受一个数组, 作为构造函数的参数
- WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名(而Map是任何类型都可)
- WeakMap的键名所指向的对象都是弱引用,不计入垃圾回收机制。因此,只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用
- WeakMap没有size属性,不能遍历
属性方法
- Set
- add(value)
- delete(value)
- has(value)
- clear()
- size
- keys()
- values()
- entries()
- forEach()
- WeakSet
- add(value)
- delete(value)
- has(value)
- Map
- set(key, value)
- get(key)
- has(key)
- delete(key)
- clear()
- size
- keys()
- values()
- entries()
- forEach()
- WeakMap
- set(key, value)
- get(key)
- has(key)
- delete(key)
总结
本文我们对前面所学的四种数据的特点和方法做统一整理和汇总,这样一看是不是更能直观的看出它们之间的异同呢,也更方便去理解它们。感谢小伙伴们的支持。
喜欢的小伙伴欢迎点赞留言加关注哦!