美文网首页
Sets和Maps《understanding ECMAScip

Sets和Maps《understanding ECMAScip

作者: aliyu | 来源:发表于2017-05-19 14:11 被阅读13次

    让我们来愉快的立一个Flag:
    每周写一篇文章

    Set

    介绍

    值(value)的集合,存储任一类型的唯一值,无论是原始还是引用,不能重复

    ES5实现的类Set

    var set = Object.create(null);
    set.foo = true;
    
    if(set.foo){
        //do something
    }
    

    存在的问题:

    • 对象的属性都是String格式,举例来说,5和'5'是等价的
    • 如果key值为Object对象,则会调用toString(),使之变为[object object]

    属性和方法

    添加值时内部使用Object.is()去判断是否有相同值,如果相同,则忽略

    new Set()

    1参,可选,参数为数组

    Set.prototype.add()

    1参,必选(如果没有则传入undefined),加入Set,返回值为该Set

    Set.prototype.has()

    1参, 返回值为true或false

    Set.prototype.delete()

    1参,需要删除的值,返回true(删除成功)或false(删除失败)

    Set.prototype.clear()

    删除所有值

    Set.prototype.forEach()

    和数组的forEach()一样
    2参,
    1参为函数,函数有三参,分别为value,value,set,是的,你没有看错,因为Set 是value的集合,所以没有key
    2参为1参中函数的this

    Set.prototype.entries()

    返回一个Generate函数, Generate函数.next()后返回值的value的是[value,value]

    Set.prototype.values()

    返回一个Generate函数, Generate函数.next()后返回值的value的是value

    Set.prototype.size

    返回Set的长度

    小技巧 - 数组去重

    //利用...
    const duplication = function(arr){
        return [...new Set(arr)]
    }
    
    

    Weak Sets

    使用Set需要注意的是:

    存在Set内的值 = 存在对象引用 = set存在时,无法被垃圾回收

    so: Weak Set 出来了

    使用Weak Set需要注意的是:

    • Weak Set只存储数据引用,不能存储原始类型,添加原始类型会报错
    • 如果只有Weak Set保存引用时,垃圾清理机制可以回收它

    特性

    • 支持add(),has(),delete()方法
    • 非iterable结构,不能用for-of循环
    • 无法从里面取到值
    • 没有forEach()等遍历方法
    • 没有size属性

    Maps

    介绍

    键值对{key:value}的集合,key存储任一类型的唯一值,无论是原始还是引用,不能重复

    属性和方法

    添加值时内部使用Object.is()去判断是否有相同值,如果相同,则忽略

    new Map()

    1参,可选,参数为数组, 例如:

    new Map([ [key1,value1],[key2,value2]);
    

    Map.prototype.set()

    1参,必选(如果没有则传入undefined,undefined),加入Map,返回值为该Map

    let a = new Map();
    a.set(key,value);
    

    Map.prototype.get()

    1参,参数为需要取的值的key,返回键值对的value,如果没有这个key,则返回undefined

    Map.prototype.has()

    1参,参数为需要取的值的key,返回值为true或false

    Map.prototype.delete()

    1参,需要删除的值的key,返回true(删除成功)或false(删除失败)

    Map.prototype.clear()

    删除所有值

    Map.prototype.forEach()

    2参,
    1参为函数,函数有三参,分别为value,key,Map
    2参为1参中函数的this

    Map.prototype.entries()

    返回一个Generate函数, Generate函数.next()后返回值的value的是[value,key]

    Map.prototype.values()

    返回一个Generate函数, Generate函数.next()后返回值的value的是value

    Map.prototype.keys()

    返回一个Generate函数, Generate函数.next()后返回值的value的是key

    Map.prototype.size

    返回Map的长度

    Weak Maps

    使用Weak Map需要注意的是:

    • Weak Map存储的键值对的key必须是对象,如果不是对象,则抛出异常
    • 如果只有Weak Map保存引用时,垃圾清理机制可以回收它

    特性

    • 支持set(),has(),delete()方法
    • 非iterable结构,不能用for-of循环
    • 无法从里面取到值
    • 没有clear()方法
    • 没有forEach()等遍历方法
    • 没有size属性

    使用场景

    • 将DOM元素以Key的值存起来
    • key->Object,value->该Object私有的数据

    相关文章

      网友评论

          本文标题:Sets和Maps《understanding ECMAScip

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