javascript中的Es6 Weakmap类的例子| Typescript

582 阅读3分钟

Javascript和typecript中的WeakMap类

Es6引入了新的集合数据结构类。WeakMap是类似于Map类的集合类之一,其他类包括SetMapWeakSet,其他类包括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没有实现迭代器,所以键和值是不可迭代的。