《吊打面试官》--说下Map和weakMap

文章介绍了ES6中的Map和WeakMap数据结构,Map用于存储任意键值对,支持任何类型作为键,且维护插入顺序,适合大量数据操作。WeakMap则只能用对象作为键,键是弱引用,无内置迭代器,便于垃圾回收。文章还讨论了Map与传统对象的区别,并提出了与之相关的面试问题。
摘要由CSDN通过智能技术生成

前言

      大家好,我叫张开心。我希望能够用通俗易懂的话语帮助前端新手快速入门。如果我在文章中有任何错误,请务必指出来,我们一起共同进步。


正文

一、逐一解析

1.Map

Map是ES6中引如的新的数据结构,也是用来存储键值对的数据结构。

创建一个Map对象:

const m1 = new Map([ 
 ["key1", "val1"], 
 ["key2", "val2"], 
 ["key3", "val3"] 
]); 

操作Map对象的方法:(具体的使用方法可参考MDN,本文重点不在这里):

增加/修改:set("key2", "val2"):第一个参数是键,第二个参数是值。

查找是否存在:has():传入键,返回是否存在。

删除:delete():传入键,删除这对。

清空:clear()。

顺序与迭代:

与object类型的一个主要差别,Map会维护键值对的插入顺序。

因为Map对象中提供了迭代器,所以可以实现对Map进行迭代,也可以使用...扩展运算符,对其转换为数组。

const m = new Map([ 
 ["key1", "val1"], 
 ["key2", "val2"], 
 ["key3", "val3"] 
]); 
//进行迭代
for (let pair of m.entries()) { 
 alert(pair); 
} 
// [key1,val1] 
// [key2,val2] 
// [key3,val3] 

//使用扩展运算符 将映射转换为数组
console.log([...m]); // [[key1,val1],[key2,val2],[key3,val3]] 

那Map和传统的Object有什么区别呢?(或者说,为什么要出现Map数据结构呢?)

1.Object只能使用字符串,数值,Symbol作为键,而Map可以使用任何数据类型作为键

2.Map使用了类似于哈希表的算法实现了快速查找和删除操作,所以在操作大量数据时,Map的性能跟好。

3.Map对象保证了插入顺序,在遍历Map对象时,不需要担心顺序问题。

4.Map对象内置了迭代器,可以使用for-of或者其他迭代器方法进行迭代,使得处理Map对象更加灵活。

5.Map提供的操作键值对的api,能够对键值对更简单的操作。

2.weakMap

weakMap只能是 引用类型作为键,当时用set()为期添加键值对,如果键不是引用类型,就会报错。

"weak"表示弱映射的键是"弱弱地拿着"。

意思就是 这些键不属于正式地引用,不会阻止垃圾回收。

如果没有对这个键的其他引用,这个键就会被回收。

const wm = new WeakMap(); 
wm.set({}, "val");  
// {} 这个对象在其他地方没有被引用, 所有这行代码在执行完毕后,这个键就会被销毁。

const wm = new WeakMap(); 
const container = { 
 key: {} 
}; 
wm.set(container.key, "val");
 //由于这个key一直被 container 所引用, 所有 这个key不会被回收。

不可被迭代:weakMap没有内置迭代器,因为他的键和值会在任何时间被回收,没有必要内置键值对。

为什么只能使用引用类型作为键?

看看红宝书怎么说:

         weakMap之所以只能用对象作为键。是为了保证只有通过键对象的引用才能获取到值,如果允许原始值,那就没办法区分初始化时使用的字符串字面量和初始化之后使用的一个相等的字符串了。

        意思就是,weakMap要达到的效果是,当其他地方没有对这个键进行引用时,要对其进行回收。 如果使用原始值,是开辟了新的内存,那就无法对weakMap的键进行追踪。使用引用类型最为键,传递的是引用类型的引用地址,内存中指向的是同一个地址。 这就会让垃圾回收机制在扫描时,如果这个对象,只有被weakMap引用时,那就说明这个对象可以被回收了。


二、额外扩展

在object与Map的区别分析中,可以延伸几个问题:

第二条中,可以延伸一道面试题:

        使用delete删除object属性时有什么诟病?

第四条中,可以延伸两道面试题。

         如何让object使用for-of?

         如何将object转换为Map对象?

这三个问题,这里不做解释。将会放在其他文章中。


话术总结

       个人认为是重中之重!!!

       在学习阶段,我们需要梳理知识点,以促进对内容的更好理解。但是在面试时,我们需要将这些知识点有条理地表达出来,避免给面试官一种零散的印象。这就需要通过练习来掌握合适的表达方式,不然就会有茶壶里倒饺子的感觉。

      在面试过程中,我建议尽量分点或者分步描述,这样既能保持思路的清晰,又能让面试官听得舒服。逐步划分话题并有条不紊地讲解,会使整个回答更易于理解和吸收。

       因此,为了在面试中表达得更加流畅,我们应该在训练中改善自己的话术,确保表达逻辑清晰、层次分明,这样既能更好地展示自己的知识水平,也能给面试官留下良好的印象。

面试官提问:“说下Map和weakMap”

我:“Map和weakMap是ES6出现的数据结构。和object类似,都是可以对键值对的存储。与object的区别就是,第一,object只能使用字符串,数字,Symbol最为键,而Map可以使用任何数据类型作为键。第二Map对象保证了插入顺序,在遍历Map对象时,不需要担心顺序问题,第三Map对象内置了迭代器,可以使用for-of或者其他迭代器方法进行迭代,使得处理Map对象更加灵活。第四Map提供的操作键值对的api,能够对键值对更简单的操作,第五Map使用类似哈希表的算法实现了快速查找和删除操作,在大量操作数据时比object更为高效。 weakMap是一种弱引用的数据结构,他和Map的区别:第一是weakMap只能使用引用类型作为键,当这个键在其他地方没有被引用时,这个键值对将会被回收。第二是weakMap对象的键值对,任何时候可能别回收,所以没有内置迭代器。”

面试官提问:“666”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值