ES6语法(5)

Map

  1. 前提:普通对象的key无论写什么类型最后都会转为字符串[除了symbol],而对象类型转为字符串则是’[object Object]’,变成相同key值,后一个会覆盖前一个
  2. 定义:与对象的区别是可以用任意数据类型做为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

  1. 和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 协议 ,转载请注明出处!