ES5 中的 Set 与 Map
Set 与 Map 并不正式存在于 ES5 中。一般会使用对象来模拟 Set 和 Map 。
set map变通方法的问题
由于对象属性的类型必须为字符串,就必须保证任意两个键不能被转换为相同的字符串。比如数字和数字组成的字符串、两个对象等。
ES6 的 Set
ES6 新增了 Set 类型,这是一种无重复值的有序列表。 Set 允许对它包含的数据进行快速访问,从而增加了一个追踪离散值的更有效方式。
创建 Set 并添加项目
Object.is()方法来判断两个值是否相等的,所以不会强制转换。(对象与之相同)
可以使用 has() 方法来测试某个值是否存在于 Set 中。
移除值
可以使用 delete() 方法来移除单个值,或调用 clear() 方法来将所有值从 Set 中移除。
Set 上的 forEach() 方法
forEach() 方法会被传递一个回调函数,该回调接受三个参数:
1. Set 中下个位置的值;
2. 与第一个参数相同的值;
3. 目标 Set 自身。
key与value相等如果想在回调函数中使用this,可以在forEach()中传入第二个参数this。或者使用箭头函数。
将 Set 转换为数组
Set 无法通过索引来访问某个值。不过可以将其转化成数组,利用扩展运算符...
数组去重Weak Set
对象存储在 Set 的一个实例中时,实际上相当于把对象存储在变量中。只要对于 Set 实例的引用仍然存在,所存储的对象就无法被垃圾回收机制回收,从而无法释放内存。
ES6 也包含了 Weak Set ,该类型只允许存储对象弱引用,而不能存储基本类型的值。对象的弱引用在它自己成为该对象的唯一引用时,不会阻止垃圾回收。
创建 Weak Set
Set 类型之间的关键差异
Weak Set 与正规 Set 之间最大的区别是对象的弱引用。若只想追踪对象的引用,应当使用 Weak Set 而不是正规 Set 。
1. 对于 WeakSet 的实例,若调用 add() 方法时传入了非对象的参数,就会抛出错误(has() 或 delete() 则会在传入了非对象的参数时返回 false );
2. Weak Set 不可迭代,因此不能被用在 for-of 循环中;
3. Weak Set 无法暴露出任何迭代器(例如 keys() 与 values() 方法),因此没有任何编程手段可用于判断 Weak Set 的内容;
4. Weak Set 没有 forEach() 方法;
5. Weak Set 没有 size 属性。
ES6 的 Map
ES6 的 Map 类型是键值对的有序列表,而键和值都可以是任意类型。键的比较使用的是Object.is()。
set() 方法并给它传递一个键与一个关联的值,来给 Map 添加项; get() 方法便能提取对应的值。
Map 的方法
has(key) :判断指定的键是否存在于 Map 中;
delete(key) :移除 Map 中的键以及对应的值;
clear() :移除 Map 中所有的键与对应的值。
size 属性,用于指明包含了多少个键值对
Map 的初始化
Map 上的 forEach 方法
三个参数的回调函数:
1. Map 中下个位置的值;
2. 该值所对应的键;
3. 目标 Map 自身。
Weak Map
在 Weak Map 中,所有的键都必须是对象(尝试使用非对象的键会抛出错误),而且这些对象都是弱引用,不会干扰垃圾回收。当 Weak Map 中的键在 Weak Map 之外不存在引用时,该键值对会被移除。
使用 Weak Map
Weak Map 的初始化
Weak Map 的方法
Weak Map 只有两个附加方法能用来与键值对交互。has() 与 delete() 方法。
对象的私有数据
Weak Map 的一个实际应用就是在对象实例中存储私有数据。
Weak Map 的用法与局限性
是否使用非对象的键。
网友评论