zoukankan      html  css  js  c++  java
  • Set、Map、WeakSet、WeakMap 理解与使用

    Set

    Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

    Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。

    注意:NaNundefined都可以被存储在Set 中, NaN之间被视为相同的值(NaN被认为是相同的,尽管 NaN !== NaN)

    属性: 

    Set.prototype.size 返回 Set 对象中的值的个数

    方法:

    Set.prototype.add(value) Set对象尾部添加一个元素。返回该Set对象

    Set.prototype.clear() 移除Set对象内的所有元素

    Set.prototype.delete(value) 移除Set中与这个值相等的元素

    Set.prototype.has(value) 返回一个布尔值,表示该值在Set中存在与否

    Set.prototype.values() 返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值

    Set.prototype.keys() values()方法相同,返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值。

    Set.prototype.entries() 返回一个新的迭代器对象,该对象包含Set对象中的按插入顺序排列的所有元素的值的[value, value]数组。为了使这个方法和Map对象保持相似, 每个值的键和值相等

    Set.prototype.forEach(callbackFn[, thisArg]) 按照插入顺序,为Set对象中的每一个值调用一次callBackFn。如果提供了thisArg参数,回调中的this会是这个参数

    let mySet = new Set()
    mySet.add("first")
    mySet.add([1,2])
    mySet.add({name:18})
    mySet.add("first")
    
    //  mySet.delete("first")
    console.log(mySet.size)
    console.log(mySet.has("first"))
    console.log(mySet.entries())
    console.log(mySet.keys())
    console.log(mySet.values())
    console.log(mySet)
    
    mySet.forEach(e=>{
    console.log(e)
    })

    set对象和数组相互转换

    let myArray = ["value1", "value2", "value3"];
    let mySet = new Set(myArray);
    let newArray = [...mySet]

    数组去重

    let arr = [1,2,3,2]
    let newArr = [...new Set(arr)]

    WeakSet

    WeakSet 对象允许你将弱保持对象存储在一个集合中。

    WeakSet 对象是一些对象值的集合, 并且其中的每个对象值都只能出现一次。在WeakSet的集合中是唯一的

    它和 Set 对象的区别有两点:

    • Set相比,WeakSet 只能是对象的集合,而不能是任何类型的任意值。
    • WeakSet持弱引用:集合中对象的引用为弱引用。 如果没有其他的对WeakSet中对象的引用,那么这些对象会被当成垃圾回收掉。 这也意味着WeakSet中没有存储当前对象的列表。 正因为这样,WeakSet 是不可枚举的。

    属性:

    WeakSet.lengthlength  属性的值为 0

    方法:

    WeakSet.prototype.add(value)  在该 WeakSet 对象中添加一个新元素 value

    WeakSet.prototype.delete(value) 从该 WeakSet 对象中删除 value 这个元素, 之后 WeakSet.prototype.has(value) 方法便会返回 false

    WeakSet.prototype.has(value) 返回一个布尔值,  表示给定的值 value 是否存在于这个 WeakSet 中

    let myWeakSet = new WeakSet()
    let a = {name:1}
    let b = {age:"22"}
    myWeakSet.add(a)
    myWeakSet.add(b)
    myWeakSet.add({sex:[1,2]})
    console.log(myWeakSet.has(a))
    myWeakSet.delete(b)
    console.log(myWeakSet)

    map

    Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。

    一个Map对象在迭代时会根据对象中元素的插入顺序来进行 — 一个  for...of 循环在每次迭代后会返回一个形式为[key,value]的数组。

    注意:键 NaN 是与 NaN 相等的(虽然 NaN !== NaN

    属性:

    Map.length属性 length 的值为 0 ,想要计算一个Map 中的条目数量, 使用 Map.prototype.size.

    方法:

    Map.prototype.get(key) 返回键对应的值,如果不存在,则返回undefined。

    Map.prototype.has(key) 返回一个布尔值,表示Map实例是否包含键对应的值。

    Map.prototype.set(key, value) 设置Map对象中键的值。返回该Map对象。

    Map.prototype.delete(key) 如果 Map 对象中存在该元素

    Map.prototype.clear() 移除Map对象的所有键/值对 。

    Map.prototype.keys() 返回一个新的 Iterator对象, 它按插入顺序包含了Map对象中每个元素的键 。

    Map.prototype.values() 返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的值 。

    Map.prototype.entries() 返回一个新的 Iterator 对象,它按插入顺序包含了Map对象中每个元素的 [key, value] 数组

    Map.prototype.forEach(callbackFn[, thisArg]) 按插入顺序,为 Map对象里的每一键值对调用一次callbackFn函数。如果为forEach提供了thisArg,它将在每次回调中作为this值。

    let myMap = new Map();
    
    let keyObj = {};
    let keyFunc = function() {};
    let keyString = 'a string';
    
    // 添加键
    myMap.set(keyString, "和键'a string'关联的值");
    myMap.set(keyObj, "和键keyObj关联的值");
    myMap.set(keyFunc, "和键keyFunc关联的值");
    
    myMap.size; // 3
    
    // 读取值
    myMap.get(keyString);    // "和键'a string'关联的值"
    myMap.get(keyObj);       // "和键keyObj关联的值"
    myMap.get(keyFunc);      // "和键keyFunc关联的值"
    
    myMap.get('a string');   // "和键'a string'关联的值"
                             // 因为keyString === 'a string'
    myMap.get({});           // undefined, 因为keyObj !== {}
    myMap.get(function() {}); // undefined, 因为keyFunc !== function () {}

    使用forEach迭代

    myMap.forEach(function(value, key) {
      console.log(key + " = " + value);
    })

    与数组关系

    let kvArray = [["key1", "value1"], ["key2", "value2"]];
    
    // 使用常规的Map构造函数可以将一个二维键值对数组转换成一个Map对象
    let myMap = new Map(kvArray);
    
    myMap.get("key1"); // 返回值为 "value1"
    
    // 使用Array.from函数可以将一个Map对象转换成一个二维键值对数组
    console.log(Array.from(myMap)); // 输出和kvArray相同的数组
    
    // 更简洁的方法来做如上同样的事情,使用展开运算符
    console.log([...myMap]);
    
    // 或者在键或者值的迭代器上使用Array.from,进而得到只含有键或者值的数组
    console.log(Array.from(myMap.keys())); // 输出 ["key1", "key2"]

    WeakMap

    WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。

    WeakMap 的 key 只能是 Object 类型。

    属性:

    WeakMap.lengthlength  属性的值为 0。

    方法:

    WeakMap.prototype.delete(key) 移除key的关联对象。执行后 WeakMap.prototype.has(key)返回false。

    WeakMap.prototype.get(key) 返回key关联对象, 或者 undefined(没有key关联对象时)。

    WeakMap.prototype.has(key) 根据是否有key关联对象返回一个Boolean值。

    WeakMap.prototype.set(key, value) 在WeakMap中设置一组key关联对象,返回这个 WeakMap对象。

  • 相关阅读:
    自动化测试如何解决验证码的问题
    python读取xml文件
    python实现简单爬虫功能
    python使用mysql数据库
    Prometheus 到底 NB 在哪里?- 每天5分钟玩转 Docker 容器技术(84)
    Prometheus 架构
    数据收集利器 cAdvisor
    Weave Scope 多主机监控
    Weave Scope 容器地图
    监控利器 sysdig
  • 原文地址:https://www.cnblogs.com/styleFeng/p/14437575.html
Copyright © 2011-2022 走看看