Map
Javascript的对象其实是键值对的集合(Hash结构),而键通常只能是 字符串 ,所以在es6
中为了解决这个问题,推出了Map
(值-值对应)数据结构,一种更完善的Hash结构实现
Api | 功能 |
---|---|
map.get(key) | 获取键为key的value |
map.set(key, value) | 赋值,返回当前Map对象,所以可以map.set().set() |
map.has(key) | 是否存在 |
map.delete(key) | 删除 |
map.size() | 成员数 |
map.cleaer() | 清空map |
遍历器
iterator | 功能 |
---|---|
map.keys() | 遍历键 |
map.values() | 遍历值 |
map.entries() | 返回成员的遍历器 |
map.forEach() | 遍历所有成员 |
-
Map的构造函数接受一个课Iterator的值作为参数
const person = [ ['name', 'zhangsan', ], ['age', 23], ] const personMap = new Map(person) /** 上面的通过构造函数初始化其实是这样实现的 */ const map = new Map() person.forEach(([key, value]) =>map.set(key, value)) return map // Map { 'name' => 'zhangsan', 'age' => 23 }
-
Map的键具有唯一性,如果键重复,前面的键将被后面的覆盖
const person = [ ['name', 'zhangsan', ], ['age', 23], ['name', 'lisi'], ['age', 34] ] const personMap = new Map(person) // Map { 'name' => 'lisi', 'age' => 34 }
-
Map的键跟内存地址绑定,当键为对象时,只有对同一个键的引用,Map才会将其视为同一个键
// 先看一个比较熟悉的问题 let obj1 = ['a1'] let obj2 = ['a1'] // 此时修改obj1并不会引起obj2的改变 // 同理 const map = new Map() map.set(['test'], 'test') map.get(['test']) // undefined // 对象作为键时,Map只会将同一个地址的对象视为同一个键 const obj = ['test'] map.set(obj, 'test') map.get(obj) // test
-
如果是简单类型的值作为键(数字,字符串,boolean,undefined, null,null不等于undefined,NaN,虽然NaN不严格等于自身,但在Map中是同一个键)
map.set(-0, 123); map.get(+0) // 123 map.set(true, 1); map.set('true', 2); map.get(true) // 1 map.set(undefined, 3); map.set(null, 4); map.get(undefined) // 3 map.set(NaN, 123); map.get(NaN) // 123