JavaScript 中的 Map 和 WeakMap 有什么区别?

javascriptobject oriented programmingprogramming

Map 和 WeakMap 之间的区别

Map 和 WeakMap 的功能机制相同,但差别不大。

1) WeakMap 仅接受对象作为键,而 Map 除了对象之外,还接受字符串、数字等原始数据类型。

2) WeakMap 如果没有对充当键的对象进行引用,则对象不会避免垃圾回收。因此,WeakMap 中没有检索键的方法,而 Map 中有诸如 Map.prototype.keys() 之类的方法来获取键。

3) WeakMap 中没有 size 属性。

Map

它用于将键与值关联,而不管数据类型如何,例如字符串、数字、对象等。

示例

<html>
<body>
<script>

// 创建一个新的 Map 对象
   var map = new Map();    

// 定义一个将在主键中使用的对象                
   var objKey = {name: 'tutorialspoint'};    
   document.write("</br>");

// 添加一个新元素,该元素的键为字符串,值也为字符串
   map.set('first', 'a');                  
   document.write("</br>");

// 添加一个新元素,其键为数字,值是数组
   map.set(3, ['c']);      
   document.write("</br>");

// 添加一个新元素,其键为对象,值是数字
   map.set(objKey, 3);

// 添加一个新元素,其键为数组,值是字符串
   map.set(['add', 'mapping'], 'd');          

// 检查映射中是否存在具有键"2"的元素。
   document.write(map.has(2));
   document.write("</br>");

// 检查映射中是否存在具有键"first"的元素。
   document.write(map.has('first'));
   document.write("</br>");

// 检索具有键"first"的元素。打印"a"
   document.write(map.get('first'));
   document.write("</br>");

// 检索具有 objKey 值的元素。
   document.write(map.get(objKey));
   document.write("</br>");

// 检索具有 "empty" 键的元素。打印 "undefined"
   document.write(map.get('empty'));
   document.write("</br>");

// 检索地图大小。打印 "4"
   document.write(map.size);
   document.write("</br>");

// 删除所有值  
   map.clear();
   document.write(map.size);
</script>
</body>
</html>

输出

false
true
a
3
undefined
4
0

WeakMap

在下面的例子中,我们可以发现 WeakMap 只接受对象,而不接受任何原始值(字符串、数字)

示例

<html>
<body>
<script>

// 创建一个新的 WeakMap 对象
   var strongMap = new WeakMap();

// 定义一个将在映射中用作键的对象
   var obj4 = {d: 4};

// 定义另一个将在映射中用作键的对象
   var obj5 = {e: 5};

// 添加一个新元素,该元素以对象为键,以字符串为值
   weakMap.set(obj4, 'fourth');

// 添加一个新元素,其键为 Object,值是 String
   weakMap.set(obj5, 'fifth');

// 添加一个新元素,其键为 Function,值是 Number
   weakMap.set(function(){}, 7);

// 检查弱映射中是否存在键值为 objKey4 的元素。
   document.write(weakMap.has(obj4));
   document.write("</br>");

// 检索与值为 objKey4 的键关联的元素的值。打印 "first"
   document.write(weakMap.get(obj4));
   document.write("</br>");

// 删除具有 objKey4 键的元素。打印 "true"
   document.write(weakMap.delete(obj4));
   document.write("</br>");

// 删除弱映射的所有元素
   weakMap.clear();

</script>
</body>
</html>

输出

true
fourth
true

相关文章