开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天
ES6新增的Map和WeakMap
ES6新增的Set和WeakSet弥补了原生JS中数组存储的不足,而Map和WeakMap则弥补了对象存储只能用字符串及Symbol类型作为key的不足:
原来不可以:{[{name:123}]:456},因为{name:123}对象会被自动执行toString方法变为字符串
现在可以:map.set({name:123},456),key被原原本本保存为了对象类型
不仅仅是Object类型,其他类型均为如此。
Map
主要方法
构造方法
let map = new Map();//创建一个空map
let map = new Map([[key, value], [key, value], [key, value]]);//传入二维数组,创建并赋值一个map
set方法
map.set(key, value);//添加键值对,返回添加后的map
get方法
map.get(key);//根据键获取值,返回对应值
has方法
map.has(key);//判断是否存在对应键值,返回布尔值,若存在则返回true
delete方法
map.delete(key);//删除对应键值对,返回布尔值,成功则返回true
forEach方法
map.forEach(value => {});//参数只写一个,则遍历到的只是值
map.forEach((value, key) => {});//参数为两个,则遍历到的便是每一个键值对
补充:如果通过let i of map来遍历,则i为每个键值对组成的数组
主要属性
size属性
等于map内元素个数
WeakMap
WeakMap与Map类似,也是以键值对的方式存储数据,二者之间的区别为:
- WeakMap只允许使用对象作为key
- 不可进行遍历
- WeakMap中对对象的引用为弱引用
什么是弱引用呢?
let obj = {name:"何小幸"};
以上就是一个引用,或者可以叫做强引用,obj指向了{name:"何小幸"}对象,而如果令obj = null,则断开了对其的引用,一旦一个对象的引用数为0,就会被当作垃圾从而回收。
那么弱引用与强引用相对,其作为引用也指向对应的对象,但它的引用不会计入引用数,当一个对象没有强引用,只有弱引用存在,垃圾回收机制同样会将其判断为垃圾从而回收,WeakSet对其内的对象就为弱引用
应用
粗略来讲,在Vue3中,实现响应式需要将data与render进行绑定,而一个rander就相当于一个obj,obj存为weakmap的键,值为存有render的map,当数据发生改变,就会调用其内的render函数,以此完成响应