es6 之 map

·  阅读 77

map

  1. map数据结构类似于对象,也是键值对的集合,但是键的范围不限于字符串,可以是各种类型的值。map提供了比Object更完善的Hash结构实现
const m = new Map();
const o = {'name': 'hello world'}

m.set(o,'content')
m.get(o) //'content'
m.delete(o) //true
m.has(o) //false
复制代码
  1. map可接受数组作为参数
const m = new Map([['name', 'hello'],['age', 18]])
m.get('name') //'hello'
m.get('age') //18 
m.has('name') //true
复制代码

map构造函数接受数组作为参数实际执行的是下面的算法

const items = [
    ['name','hello'],
    ['age',18]
]
const m = new Map()
items.forEach(
    ([key,value]) => m.set(key,value)
)
复制代码
  1. 只有对同一个对象的引用,Map对象才将其视为同一个键。
const m = new Map()
const a = [];
m.set([],'content')
m.get([]) //undefined 因为这两个是不同的引用

m.set(a,'contenta')
m.get(a) //'contenta' 这里是两个相同的引用
复制代码
  1. Map的键实际是跟内存地址绑定的,只要内存地址不一样,就被视为两个键。
  2. 如果Map的键是一个简单类型的值(数字,字符串,布尔值),则只要两个值严格相等,Map将其视为同一个键。比如0和-0就是一个键,布尔值true和字符串true则是两个不同的键。另外,undefined和null也是两个不同的键。虽然NaN不严格相等于自身,但 Map 将其视为同一个键。

属性

  1. size
const map = new Map();
map.set('foo', true);
map.set('bar', false);

map.size // 2
复制代码
  1. set 方法返回的是整个map对象,所以可以采用链式的写法
map.set('foo',true).set('bar',false)
复制代码
  1. clear方法 可清除所有成员
map.clear()
map.size //0
复制代码

WeakMap

  1. WeakMap只接受对象作为键名,null除外
const wm = new WeakMap()
wm.set('1','content') //报错 // TypeError: Invalid value used as weak map key
复制代码
  1. WeakMap的键名所指向的对象,不计入垃圾回收机制,如果你想往对象上添加数据,又不想干扰垃圾回收机制的话,就可以使用WeakMap
  2. 一个典型应用场景是,在网页的 DOM 元素上添加数据,就可以使用WeakMap结构。当该 DOM 元素被清除,其所对应的WeakMap记录就会自动被移除。
const wm = new WeakMap();
const element = document.getElementById('example');

wm.set(element, 'some information');
wm.get(element) // "some information"
复制代码
分类:
前端
标签:
分类:
前端
标签: