ES6: Map

xiaoxiao2021-02-28  62

Map

ES6提供了Map数据结构。它类似于对象,也是键值对的集合,但是键的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object结构提供了字符串: 值的对应,Map结构提供了值: 值的对应,是一种更完善的Hash结构实现。如果你需要键值对的数据结构,Map 比Object更合适。

构造
const map = new Map();
成员数
map.size
添加
map.set(1, "one").set(2, "two");
取值
map.get(1); // "one"
是否有key
map.has(1); // true map.has(3); // false
删除
map.delete(1);
清除
map.clear();
遍历
keys():返回键名的遍历器。 const map = new Map([ ['F', 'no'], ['T', 'yes'], ]); for (let key of map.keys()) { console.log(key); } // "F" // "T" values():返回键值的遍历器。 const map = new Map([ ['F', 'no'], ['T', 'yes'], ]); for (let value of map.values()) { console.log(value); } // "no" // "yes" entries():返回所有成员的遍历器。 const map = new Map([ ['F', 'no'], ['T', 'yes'], ]); for (let item of map.entries()) { console.log(item[0], item[1]); } // "F" "no" // "T" "yes" // 或者 for (let [key, value] of map.entries()) { console.log(key, value); } // "F" "no" // "T" "yes" // 等同于使用map.entries() for (let [key, value] of map) { console.log(key, value); } // "F" "no" // "T" "yes" forEach():遍历 Map 的所有成员。 map.forEach(function(value, key, map) { console.log("Key: %s, Value: %s", key, value); });
与其他数据结构的互相转换
Map转为数组 Map转为数组最方便的方法,就是使用扩展运算符...。 const map = new Map() .set(true, 7) .set({foo: 3}, ['abc']); [...map] // [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ] 数组转为Map 将数组传入Map构造函数,就可以转为Map。 const map = new Map([ [true, 7], [{foo: 3}, ['abc']] ]); Map转为对象 function mapToObj(map) { let obj = Object.create(null); for (let [k,v] of map) { obj[k] = v; } return obj; } const map = new Map() .set('yes', true) .set('no', false); const obj = mapToObj(map) // { yes: true, no: false } 对象转为 Map function objToMap(obj) { let map = new Map(); for (let k of Object.keys(obj)) { map.set(k, obj[k]); } return map; } objToMap({yes: true, no: false}) // Map {"yes" => true, "no" => false}

WeakMap

WeakMap键名所引用的对象都是弱引用,即垃圾回收机制不将该引用考虑在内。因此,只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。

WeakMap与Map的区别
WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。WeakMap的键名所指向的对象,不计入垃圾回收机制。
方法

WeakMap只有四个方法可用:get()、set()、has()、delete()。

转载请注明原文地址: https://www.6miu.com/read-2632165.html

最新回复(0)