Set和Map

作者: 吴晗君 | 来源:发表于2019-03-25 19:26 被阅读0次

    前言

    学习这些数据结构、Generator前先看遍历器iterator这一章比较好。之前Set、Map这一章看了好几遍,但是看一遍忘一遍。现在先看了iterator,再看这些就是在不断加深遍历器的印象。

    Set

    翻译

    集合

    定义

    Set是一种数据结构,特点是成员唯一。在代码中,Set是一个构造函数,参数必须具备iterator接口,WeakSet一样。

    字符串去重

    [...new Set('ababbc')].join('') // abc
    

    增、改

    add

    delete
    clear

    has
    size

    遍历

    除了keys、values、entries

    forEach也可以用来遍历Set结构,注意以下两点:
    ⚠️遍历Set得到的键名和键值是一个值。
    ⚠️遍历顺序就是插入顺序。

    并集、交集、差集

    let a = new Set([1, 2, 3])
    let b = new Set([3, 4, 5])
    
    let union = [...new Set([...a, ...b])]
    
    let difference = [...a].filter((x) => !b.has(x))
    
    let intersect = [...a].filter((x) => b.has(x))
    
    

    在循环中同步改变原Set

    1. 转成数组通过操作再转回去
    2. 通过Array.form第二个参数,修改完,再转回去。
    

    WeakSet

    和Set两个区别:

    1. 成员只能是对象,添加其他会报错。
    2. 对成员对引用是弱引用,不在垃圾回收优化考虑范围内。也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存。
    3. 没有size属性
    4. 不能被遍历

    因为第二点,所以导致WeakSet不能被遍历,原因是垃圾回收时间是不确定的。所以,可能不同时间遍历WeakSet的时候拿到的东西不一样,WeakMap也是一样。

    应用

    存储DOM节点,避免节点删除后,变量中还保留着节点对象,导致内存泄露。

    Map

    传统的对象的键只能是字符串。为了解决这个问题,引入了Map,Map可以是任意结构。

    api

    大致上语法和spi和Set没有区别,麻烦在和各种数据结构之间的转化,基本上靠的是for...of遍历或者拓展运算符。

    WeakMap

    和Map的区别

    1. 只接受除了null以外的对象为键名。
    2. 键名所指向的对象,不计入垃圾回收机制。

    场景

    WeakMap的专用场合就是,它的键所对应的对象,可能会在将来消失。WeakMap结构有助于防止内存泄漏

    api

    size、forEach、clear没有

    相关文章

      网友评论

          本文标题:Set和Map

          本文链接:https://www.haomeiwen.com/subject/shabvqtx.html