ES6--(7) Set与Map

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 的用法与局限性

    是否使用非对象的键。

你可能感兴趣的:(ES6--(7) Set与Map)