Set && Map

146 阅读1分钟

Map

  • Notes: key-value paird,记住插入顺序,任何值可以做key or value.
  • 一个key只出现一次,是唯一的;时间复杂度小于O(N)

示例

const map1 = new Map();
map1.set('a', 1);
map1.set('b', 2);
map1.set('c', 3);
for(const key of map1){
    console.log(ke)          // Array ["a", 1]
}
console.log(map1.get('a'));  // 1
map1.set('a', 97);
console.log(map1.get('a'));  // 97
console.log(map1.size);      // 3
map1.delete('b');
console.log(map1.size);      // 2

Map Vs Object

MapObject
accidental key默认不包含任何key,只包含set插入的key
  • Object有prototype,它包含默认的key,这个可能造成key的冲突
  • 可以使用Object.create(null) 不要prototype
  • key TYPES任何值(function、objects、promitive)eithor String or Symbol
    key orderinsertion order
  • 非常复杂
  • for-in: enumerable string-keyed
  • Object.keys(): own, enumerable, string-keyed
  • Object.getOwnPropertyNames(): own, string-keyed even if non-enumerable
  • Object.getOwnPropertySymbols(): 同上,只包含symbol
  • sizemap.size()没有明确定义,可以使用Object.keys().length
    performance频繁操作性能优越没有优化
    Serialization and parsing没有原生支持,可以参考社区提供的序列号方法 How do you JSON.stringify an ES6 Map?原生支持 JSON.parse JSON.stringify

    Map.prototype[@@toStringTag]

    class ValidatorClass {
      get [Symbol.toStringTag]() {
        return 'Validator';
      }
    }
    console.log(Object.prototype.toString.call(new ValidatorClass()));
    Object.prototype.toString.call(new Map()) // '[object Map]'
    
    

    实力方法

    详情见MDN - Map

    Set

    • 存储任何类型的唯一值
    • 相同值只存储一次,插入顺序,时间复杂度好于O(N)
    • has 方法的性能好于arr.includes()的。

    Set没有set,get方法,新增了add方法。

    1. Set.prototype.keys()Set.prototype.values()相同。

    • Set.prototype.entries() 返回包含 **[value, value]**的遍历对象。