很多东西就是要细细的品读然后做点读书笔记,心理才会踏实…
Javascript对象本质上就是键值对的集合(Hash结构),但是键只能是字符串,这有一定的限制。
1 | var d = {} |
上段代码的原意是将DOM节点作为对象d
的键,由于对象只接受字符串,所以ele被自动转为[object HTMLBodyElement]
为了解决这种限制,ES6提供了Map数据结构,类似于对象,但是键的范围不限制于字符串,各类数据类型(包括对象)都可以作为键。
Map基本用法
请看代码
1 | var m = new Map() |
演示过程如下
Map构造函数可以接收数组作为参数,该数组的成员是一个个表示键值对的数组,如
1 | var arr = [ ['name', 'liujiangbei'], ['title', '屌丝男'] ] |
该过程就好比
1 | var map = new Map() |
另外需要特别注意,只有对同一个对象的引用,Map结构才将其视为同一个key。一定是内存地址是一样的两个值。
对同一个key进行set,后面的值会覆盖前边的值。
1 | var m = new Map() |
Map的键实际上跟内存地址绑定,只要内存不一样,就视为两个key,这就解决了同名属性碰撞的问题,
如果Map的键是简单类型(数字、字符串、布尔),则只要两个值严格相等,Map就将其视为同一个Key,虽然NaN === NaN
为FALSE,但Map将其视为同一Key
1 | let map = new Map() |
这个地方也要特别注意…
Map实例属性和方法
属性和方法
- size属性
- set(k, v)
- get(k)
- has(k)
- delete(k)
- clear()
遍历方法
- keys()
- values()
- entries()
- forEach()
1 | for (let [k, v] of map.entries) { console.log(k, v) } |
等同于
1 | for (let [k, v] of map) { console.log(k, v) } |
因为表示Map结构的默认遍历器结构(Symbol.iterator
)就是entries
方法
1 | var map = new Map() |
forEach()方法
1 | var obj = {} |
Map和Array等数据结构的化学反应
Map和Array
前边讲到Map的构造函数接收数组,所以Map和Array之间的转化比较方便,但是也有一些约束。
大专栏 ES6中Map数据结构学习笔记ap">Array转Map
1 | var arr = [[1, 'ext', '1'], ['2', 2], [3, '3', 'ext']] |
可以看出数组转为Map需要满足,数组的元素为数组或者object。
Map转Array
利用扩展运算符...
很容易实现
1 | var arr = [ |
利用Array的map和filter方法实现Map的map和filter特性
Map本身并没有map和filter方法,由于数组和Map转换很方便所以利用数组的map的filter特性从而实现达到map和filter的特性。
1 | var arr = [[1, '1'], [2, '222'], [3, '333']] |
Map和Object
Map转为Object
如果Map的键全为字符串、数字、bool,则其可以转为对象,键非字符串的会通过.toString()方法转化。
1 | function mapToObj (map) { |
Object转为Map
1 | function objToMap (obj) { |
Map和JSON
Map转为JSON
Map的键都是字符串,这是直接转为对象JSON
1 | JSON.stringify(mapToObj(obj)) |
Map的键有非字符串,这是可选择转为数组JSON
1 | JSON.stringify([...map]) |
JSON转Map
JSON都是字符串的方式,所以先通过JSON.parse(jsonStr)
转为对象,然后通过上边的objToMap
即可实现转化
有一种特殊情况,整个JSON就是一个数组,诶个数组成员又都是有两个成员的数组,他可以一一对应转为Map
1 | new Map(JSON.parse(jsonStr)) |
结束语
网络上这么多同类型的文章为何我还要多此一举?
看到的永远是别人的,写下来才是自己的,知易行难,日拱一卒,坚持比什么都重要!这句话送给大家也送给我自己…