-
Notifications
You must be signed in to change notification settings - Fork 134
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Set、WeakSet、Map及WeakMap #24
Comments
This was referenced Feb 16, 2019
Open
好详细 可以搬走吗 |
复习面试题的时候找到博主的这篇,能转载吗? |
This was referenced Apr 2, 2020
补充下四种相等性算法
|
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Set 和 Map 主要的应用场景在于 数据重组 和 数据储存
Set 是一种叫做集合的数据结构,Map 是一种叫做字典的数据结构
1. 集合(Set)
ES6 新增的一种新的数据结构,类似于数组,但成员是唯一且无序的,没有重复的值。
Set 本身是一种构造函数,用来生成 Set 数据结构。
举个例子:
Set 对象允许你储存任何类型的唯一值,无论是原始值或者是对象引用。
向 Set 加入值的时候,不会发生类型转换,所以
5
和"5"
是两个不同的值。Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===
),主要的区别是** Set 认为NaN
等于自身,而精确相等运算符认为NaN
不等于自身。**Set 实例属性
constructor: 构造函数
size:元素数量
Set 实例方法
add(value):新增,相当于 array里的push
delete(value):存在即删除集合中value
has(value):判断集合中是否存在 value
clear():清空集合
Array.from
方法可以将 Set 结构转为数组keys():返回一个包含集合中所有键的迭代器
values():返回一个包含集合中所有值得迭代器
entries():返回一个包含Set对象中所有元素得键值对迭代器
forEach(callbackFn, thisArg):用于对集合成员执行callbackFn操作,如果提供了 thisArg 参数,回调中的this会是这个参数,没有返回值
Set 可默认遍历,默认迭代器生成函数是 values() 方法
所以, Set可以使用 map、filter 方法
因此,Set 很容易实现交集(Intersect)、并集(Union)、差集(Difference)
2. WeakSet
WeakSet 对象允许你将弱引用对象储存在一个集合中
WeakSet 与 Set 的区别:
属性:
constructor:构造函数,任何一个具有 Iterable 接口的对象,都可以作参数
方法:
3. 字典(Map)
集合 与 字典 的区别:
任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作
Map
构造函数的参数,例如:如果读取一个未知的键,则返回
undefined
。注意,只有对同一个对象的引用,Map 结构才将其视为同一个键。这一点要非常小心。
上面代码的
set
和get
方法,表面是针对同一个键,但实际上这是两个值,内存地址是不一样的,因此get
方法无法读取该键,返回undefined
。由上可知,Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。
如果 Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键,比如
0
和-0
就是一个键,布尔值true
和字符串true
则是两个不同的键。另外,undefined
和null
也是两个不同的键。虽然NaN
不严格相等于自身,但 Map 将其视为同一个键。Map 的属性及方法
属性:
constructor:构造函数
size:返回字典中所包含的元素个数
操作方法:
遍历方法
Map 结构的默认遍历器接口(
Symbol.iterator
属性),就是entries
方法。Map 结构转为数组结构,比较快速的方法是使用扩展运算符(
...
)。对于 forEach ,看一个例子
在这个例子中, forEach 方法的回调函数的 this,就指向 reporter
与其他数据结构的相互转换
Map 转 Array
Array 转 Map
Map 转 Object
因为 Object 的键名都为字符串,而Map 的键名为对象,所以转换的时候会把非字符串键名转换为字符串键名。
Object 转 Map
Map 转 JSON
JSON 转 Map
4. WeakMap
WeakMap 对象是一组键值对的集合,其中的键是弱引用对象,而值可以是任意。
注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。
WeakMap 中,每个键对自己所引用对象的引用都是弱引用,在没有其他引用和该键引用同一对象,这个对象将会被垃圾回收(相应的key则变成无效的),所以,WeakMap 的 key 是不可枚举的。
属性:
方法:
5. 总结
6. 扩展:Object与Set、Map
Object 与 Set
Object 与 Map
JS 中的对象(Object),本质上是键值对的集合(hash 结构)
但当以一个DOM节点作为对象 data 的键,对象会被自动转化为字符串[Object HTMLCollection],所以说,Object 结构提供了 字符串-值 对应,Map则提供了 值-值 的对应
The text was updated successfully, but these errors were encountered: