ES6语法(5)
Map
- 前提:普通对象的key无论写什么类型最后都会转为字符串[除了symbol],而对象类型转为字符串则是’[object Object]’,变成相同key值,后一个会覆盖前一个
- 定义:与对象的区别是可以用任意数据类型做为key值且不会转成字符串类型
注意: 如果是数组作为key存值,那么需要传递entires格式
const map = new Map()
// size属性
map.size
// set方法
map.set( {name:1}: '2' )
// get方法
map.get( {name:1} ) --> '2'
// has方法
map.has( { name :1} ) --> true
// delete方法
map.delete( { name :1} ) --> true
//clear方法
map.clear()
// 数组作为key
const map2 = new Map()
map2.set( [2,'add'], [ { a: 1 }, 'mul' ] )
console.log(map2) --> { 2 => 'add' ,{a: 1} => 'mul' }
//遍历map
map.forEach( (item,key,map) =>{ console.log(item) } )
for( const item of map){
item --> [key,value] 的数组
}
WeakMap
- 和Map区别: key只能为对象,对象的引用也是弱引用,如果没有其它对象引用会被GC回收,不能被遍历
/* Vue3部分原理 */
let obj1 = { name:'nano', age:18 }
let obj2 = { name:'roily',age:19 }
function obj1NameFn1(){}
function obj1NameFn2(){}
function obj1AgeFn1(){}
function obj1AgeFn2(){}
function obj2NameFn1(){}
function obj2NameFn2(){}
// 创建Map存储监控的对象和方法
let mapObj1 = new Map()
mapObj1.set('name',[ obj1NameFn1, obj1NameFn2 ])
mapObj1.set('age',[ obj1AgeFn1, obj1AgeFn1 ])
// 创建weakMap存储对应函数
let weakMap = new WeakMap( )
// 这里存储了obj1和监控obj1key值的方法
weakMap.set(obj1,mapObj1)
// 当obj1里其中一个值被改变时
obg1.name = 'Nye'
// 从weakMap中获取存储的mapObj1数据结构
let obj1Map = weakMap.get( obj1 )
// 再从mapObj1中获取对应的方法
let fnList = obj1Map.get( ' name ' )
//循环调用方法
fnList.forEach( item => item( ) )
注意:当WeakMap取消引用时,Map中存储的也会被消失
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!