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?
- 对象的key只能是String、Symbol,而Map实际的key可以是任意类型。
- Map类型拥有size属性。
- 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基本上非常相似,有几点是不一样的:
- key必须是对象类型,不能是基础数据类型。
- key仅是弱引用,意味着可key引向的对象存在被垃圾回收的可能。
- WeakMap对象无法被遍历。
因为WeakMap内数据存在被回收的可能,所以WeakMap特别适用于作为数据缓存。
好了,完结。
什么是WeakSet?
网友评论