Javascript和typecript中的WeakMap类
Es6引入了新的集合数据结构类。WeakMap是类似于Map类的集合类之一,其他类包括Set、Map和WeakSet,其他类包括Set、Map和WeakSet。
WeakMap是一个存储键和值的地图类,键存储弱引用,也就是说,如果键的引用没有被引用,给定键的值将被垃圾回收。
所以weakMap保存了键对象的弱引用。如果键对象被引用/销毁,垃圾收集器会自动从WeakMap中删除条目(键和值),内存消耗就会减少。
Typescript不支持Map或WeakMap,Typescript是javascript/ES6的一个扩展版本,我们可以通过一些配置来使用。只要在typescript配置中配置Es6库,就可以在typescript中使用Es6类。在tsconfig.json文件中,添加 "lib"。["es6"]或者你可以为这个类添加polyfill.js。Typescript没有支持Map的内置类,但Typescript支持ES6支持的相同数据结构。
WeakMap的声明和创建
空的WeakMap是用new关键字创建的。
也可以使用可迭代对象来创建,这些对象包含键和值对。
new WeakMap(iterable : Object)
例如,我们将使用键和值的数组来创建一个地图
var key = { id: 1 };
var value = { name: 'kiran' };
var map = new WeakMap([[key, value]]);
console.log(map)
输出是
[[Entries]]: Array(1)
0: {Object => Object}
key: {id: 1}
value: {name: "kiran"}
length: 1
方法
WeakMap只有添加/删除、检查键、空地图操作的方法,没有实现可迭代操作。
WeakMap.set()方法
它在地图中存储键和值
语法:
set(key : Object, value : Object) : WeakMap
原始类型--字符串、布尔值、数字、未定义和共轭对象不允许用于键值。只允许使用对象
var weakMap = new WeakMap()
var key = { id: 1 };
weakMap.set(key, 'v')
console.log(weakMap.has(key))
console.log(weakMap.has(null))
输出是
[[Entries]]: Array(1)
0: {Object => "v"}
key: {id: 1}
value: "v"
length: 1
WeakMap.has()方法
has()方法如果键已经存在则返回true,否则返回false。
参数是对象的键值 例子 下面是一个has方法的使用例子。
var weakMap = new WeakMap()
var key = { id: 1 };
weakMap.set(key, 'v')
console.log(weakMap.has(key)) //true
console.log(weakMap.has(null)) // false
WeakMap.delete()方法
该方法用于从地图中删除键,如果存在则返回true,否则返回false。语法
delete(key : Object) : Boolean
例子这里是一个删除方法的使用例子
var weakMap = new WeakMap()
var key = { id: 1 };
weakMap.set(key, 'v')
console.log(weakMap.delete(key)) // true
console.log(weakMap.delete(null)) // false
允许的和不允许的键示例
WeakMap的键不允许原始类型和Symbole对象,并给出编译错误--'Symbol'类型的参数不能分配给'object'类型的参数。
var map = new WeakMap()
map.set(new Date(), function currentTime () {}) // acceptable
map.set(() => 'key', { objectkey: 'objectvalue' })// acceptable
map.set(1,123) // not acceptable, primitive not allowed as keys
map.set(Symbol('symbol'), [6, 21]) // not acceptable, Symbole not allowed as keys
console.log(map)
WeakMap和Map的使用差异示例
下面是一个Map和WeakMap方法使用的例子
var map=new Map();
var weakMap=new WeakMap();
var object1={'one':'two'};
var object2={'five':'six'};
map.set(object1,'kiran')
weakMap.set(object2,'kiran2')
console.log(map.get(object1)) // kiran
console.log(map.get(object2)) // undefined
var map=new Map();
var weakMap=new WeakMap();
var object1={'one':'two'};
var object2={'five':'six'};
map.set(object1,'frank');
weakMap.set(object2,'frank2');
console.log(map.get(object1)); // frank
console.log(weakMap.get(object2)); // frank2
Map和WeakMap的区别
两者都只用于存储键和值
| 设置 | WeakMap |
|---|---|
| 地图的键是强引用 | WeakMap的键是弱引用 |
| 内存消耗很高 | 内存消耗较少,如果有任何键未被引用,该条目将被自动垃圾回收。 |
| 键可以是原始类型,如字符串、数字、日期、符号、函数、对象和日期。 | 键不能是原始类型和符号对象,其他对象是允许的 |
| 地图有迭代器的实现方法,如keys(),values(), entries()和forEach()方法。 | Weakmap没有实现迭代器,所以键和值是不可迭代的。 |