004|JavaScript ES6新特性之Map&We

作者: 中年小钢炮 | 来源:发表于2017-05-30 17:36 被阅读98次

    Map

    Map是一个存储key-value的容器,对象、基础类型均可以作为key或value。

    var myMap = new Map();
    
    var keyString = 'a string',
        keyObj = {},
        keyFunc = function() {};
    
    // setting the values
    myMap.set(keyString, "value associated with 'a string'");
    myMap.set(keyObj, 'value associated with keyObj');
    myMap.set(keyFunc, 'value associated with keyFunc');
    
    myMap.size; // 3
    
    // getting the values
    myMap.get(keyString);    // "value associated with 'a string'"
    myMap.get(keyObj);       // "value associated with keyObj"
    myMap.get(keyFunc);      // "value associated with keyFunc"
    
    myMap.get('a string');   // "value associated with 'a string'"
                             // because keyString === 'a string'
    myMap.get({});           // undefined, because keyObj !== {}
    myMap.get(function() {}) // undefined, because keyFunc !== function () {}
    

    一个对象也可以作为一个map来使用,那为什么es6还要引入Map?

    1. 对象的key只能是String、Symbol,而Map实际的key可以是任意类型。
    2. Map类型拥有size属性。
    3. Map类型中插入的key-value有序。

    Map对象遵循iterable协议,可以使用for...of来遍历:

    var myMap = new Map();
    myMap.set(0, 'zero');
    myMap.set(1, 'one');
    for (var [key, value] of myMap) {
      console.log(key + ' = ' + value);
    }
    // 0 = zero
    // 1 = one
    
    for (var key of myMap.keys()) {
      console.log(key);
    }
    // 0
    // 1
    
    for (var value of myMap.values()) {
      console.log(value);
    }
    // zero
    // one
    
    for (var [key, value] of myMap.entries()) {
      console.log(key + ' = ' + value);
    }
    // 0 = zero
    // 1 = one
    

    Map对象也提供了forEach方法来遍历:

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

    Map能够与Array进行转换:

    var kvArray = [['key1', 'value1'], ['key2', 'value2']];
    
    var myMap = new Map(kvArray);
    myMap.get('key1'); // returns "value1"
    
    console.log(Array.from(myMap)); // 还原为Array
    console.log(Array.from(myMap.keys())); // Will show ["key1", "key2"]
    

    WeakMap

    WeakMap的特性与Map基本上非常相似,有几点是不一样的:

    1. key必须是对象类型,不能是基础数据类型。
    2. key仅是弱引用,意味着可key引向的对象存在被垃圾回收的可能。
    3. WeakMap对象无法被遍历。

    因为WeakMap内数据存在被回收的可能,所以WeakMap特别适用于作为数据缓存。

    好了,完结。

    什么是WeakSet?

    相关文章

      网友评论

        本文标题:004|JavaScript ES6新特性之Map&We

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