Javascript中的Map和WeakMap对象什么区别

面试笔试题目Javascript中的Map和WeakMap对象什么区别
1
前端学堂 管理员 asked 7 months ago
笑语 管理员 replied 7 months ago

参考:https://blog.csdn.net/c__dreamer/article/details/82182649

2 Answers
0
前端学堂 管理员 answered 7 months ago

Map对象是一种有对应 键/值 对的对象, JS的Object也是 键/值 对的对象 ;
  ES6中Map相对于Object对象有几个区别:
  1:Object对象有原型, 也就是说他有默认的key值在对象上面, 除非我们使用Object.create(null)创建一个没有原型的对象;
  2:在Object对象中, 只能把String和Symbol作为key值, 但是在Map中,key值可以是任何基本类型(String, Number, Boolean, undefined, NaN….),或者对象(Map, Set, Object, Function , Symbol , null….);
  3:通过Map中的size属性, 可以很方便地获取到Map长度, 要获取Object的长度, 你只能用别的方法了;
  Map实例对象的key值可以为一个数组或者一个对象,或者一个函数,比较随意 ,而且Map对象实例中数据的排序是根据用户push的顺序进行排序的, 而Object实例中key,value的顺序就是有些规律了, (他们会先排数字开头的key值,然后才是字符串开头的key值);
Map实例的方法
  clear()方法, 删除所有的键/值对;
  delete(key), 删除指定的键/值对;
  entries()返回一个迭代器, 迭代器按照对象的插入顺序返回[key, value];
  forEach(callback , context) 循环执行函数并把键/值对作为参数; context为执行函数的上下文this;
  get(key) 返回Map对象key相对应的value值;
  has(key) 返回布尔值, 其实就是返回Map对象是否有指定的key;
  keys() 返回一个迭代器,迭代器按照插入的顺序返回每一个key元素;
  set(key, value) 给Map对象设置key/value 键/值对, 返回这个Map对象(相对于Javascript的Set,Set对象添加元素的方法叫做add,而Map对象添加元素的方法为set;
  [@@iterator] 和entrieds()方法一样, 返回一个迭代器, 迭代器按照对象的插入顺序返回[key, value];
WeakMap
  WeakMap是弱引用的Map对象, 如果对象在js执行环境中不存在引用的话,相对应的WeakMap对象内的该对象也会被js执行环境回收;
  WeakMap对象的属性:无
  WeakMap对象的方法:
  delete(key) : 删除指定的键/值对;
  get(key) :返回Map对象key相对应的value值;
  has(key) :返回布尔值, 其实就是返回Map对象是否有指定的key;
  set(key):给Map对象设置key/value 键/值对, 返回这个Map对象;

0
前端学堂 管理员 answered 7 months ago

Es6提供了Map数据结构,它类似于对象,也是键值对的集合,但是‘键’的范围不限于字符串,各种类型的值(包括对象)都可以作为键名。也就是说,Object结构提供了“字符串-值”的对应,Map结构提供了“值-值”的对应。是一种更完善的Hash结构实现。如果你需要‘键值对’的数据结构,Map比Object更适合。
WeakMap与Map有两点区别。
第一:和WeakSet一样,WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。
第二:WeakSet的键名所指的对象,不计入垃圾回收机制。
 WeakMap的设计目的在于,有时我们想在某个对象上面存放一些数据,但是这会形成对于这个对象的引用。一旦不再需要这两个对象,我们就必须手动删除这个引用,否则垃圾回收机制就不会释放对象占用的内存。
const e1 = document.getElementById(“foo”);
const e2 = document.getElementById(“bar”);
const arr = [
[e1,”foo元素”],
[e2,”bar元素”],
]
//不再使用必须手动删除引用
arr[0] = null;
arr[1] = null;
 WeakMap 就是为了解决这个问题而诞生的,它的键名所引用的对象都是弱引用,即垃圾回收机制不将该引用考虑在内。因此,只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。
 基本上,如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。一个典型应用场景是,在网页的 DOM 元素上添加数据,就可以使用WeakMap结构。当该 DOM 元素被清除,其所对应的WeakMap记录就会自动被移除。
const wm = new WeakMap();
const element = document.getElementsByTagName(“div”)[0];
wm.set(element,”some information”);
console.log(wm.get(element));
 注意的是,WeakMap弱引用的只是键名,而不是键值。键值依然是正常引用。
const wm = new WeakMap();
let key = {};
let obj = {foo : 1};
wm.set(key,obj);
obj = null;
console.log(wm.get(key)); //{foo : 1}
WeakMap的语法
 WeakMap和WeakSet相似,没有遍历方法和清空方法,WeakMap只有四个方法可以使用:get(),set(),has(),delete()。

Your Answer

如果对您有帮助,别忘了打赏一下宝宝哦!

支付宝扫一扫打赏

微信扫一扫打赏