Map 和 WeakMap

在对象中,如果键值设置为了数字,对象会自动把数字转换为字符串

let obj = {
      1: 'hhh',
      '1': 'bbb'
    }
    console.log(obj)

相当于创建了两个键值是字符串1的值,后面的把前面的覆盖掉,结果等同如下

let obj = {
      '1': 'bbb'
    }

所以如果对象赋值,同名一个字符串一个数字是不可能的,但如果遇到这种需求会怎么办呢,使用Map,Map对键值的比较是使用Object.is()

1. map.set('键名','键值') 设置值

let map = new Map()
    map.set('name', 'zhou')
    map.set(1, 'hh')
    map.set('1', 'aa')
    console.log(map) // Map(3) {"name" => "zhou", 1 => "hh", "1" => "aa"}

链式调用:

let map = new Map()
    map.set('name', 'zhou').set(1, 'hh').set('1', 'aa')
    console.log(map) // Map(3) {"name" => "zhou", 1 => "hh", "1" => "aa"}

键值设置为对象:

 let map = new Map()
    let obj = {
      name: 'zhou'
    }
    map.set(obj, 'fang')
    console.log(map)

Map 和 WeakMap_第1张图片

2. map.get('键名')  取值

let map = new Map()
    map.set('name', 'zhou').set(1, 'hh').set('1', 'aa')
    console.log(map.get('name')) // zhou
    console.log(map.get('1')) // aa
    console.log(map.get(1)) // hh

3. map.has('键名') 判断是否存在

let map = new Map()
    let obj = {
      name: 'zhou'
    }
    map.set(obj, 'fang')
    console.log(map.has(obj)) // true
    console.log(map.has(name)) // false

4. map.delete('键名') 删除 删除成功返回true否则返回false

let map = new Map()
    let obj = {
      name: 'zhou'
    }
    map.set(obj, 'fang').set('age', 21)
    console.log(map.delete(obj)) // true
    console.log(map.delete('age')) // true
    console.log(map.delete(name)) // false
    console.log(map) // Map(0) {}

.5. map.clear() 清空map 无返回值

let map = new Map()
    let obj = {
      name: 'zhou'
    }
    map.set(obj, 'fang').set('age', 21)
    map.clear()
    console.log(map) // Map(0) {}

7. map.size:用于指明包含了多少对键值

console.log(map.size)

8.  map初始化

可以一次性将大量数据添加到Map中,将数组传入Map构造器,该数组中每一项也必须是一个数组,内部数组的首个项会作为键,第二项为对应值。

let map = new Map([['name', 'zhou'], ['age', 21], ['sex', '女']])
    console.log(map)
    console.log(map.size) // 3

Map 和 WeakMap_第2张图片

9. Map 遍历 (键值)

let map = new Map()
    let obj = {
      name: 'zhou'
    }
    map.set(obj, 'fang').set('age', 21)
    map.forEach((value,key) => {
      console.log(value,key)
    })

注意key、value顺序,第一个参数是值,第二个参数是键,第三个参数是Map本身

10. WeakMap

WeakMap 也是弱引用类型,键必须是数组或对象,基本引用类型会报错。当WeakMap中的键在WeakMap之外不存在引用时,该键值对会被移除。

WeakMap至于两个方法能用来与键值交互,has() 和 delete()

也没有 forEach等操作

let map = new WeakMap()
    let arr = []
    map.set(arr, 'zhou')

内存引用于WeakSet相同

Map 和 WeakMap_第3张图片

let Map = new WeakMap()
    let element = document.getElementsByClassName('element')[0]
    Map.set(element, 'Original')
    console.log(Map)
    element.parentNode.removeChild(element)
    element = null
    setInterval(() => {
      console.log(Map)
    }, 4000)

Map 和 WeakMap_第4张图片

不会立即被垃圾回收,可看到大概8s之后,WeakMap变为空

不再可用后被销毁,能够优化内存使用并且规避内存泄漏

你可能感兴趣的:(es6经典入门到进阶)