map——ES6的新数据结构
2020-08-16 17:22
786 查看
map——ES6的新数据结构
基本语法
ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
- 实例化
let map = new Map([iterable])
Iterable 可以是一个数组或者其他 iterable 对象,其元素为键值对(两个元素的数组,例如: [[ 1, ‘one’ ], [ 2, ‘two’ ]])。 每个键值对都会添加到新的 Map。null 会被当做undefined。
- 常用方法
has(keyObj):判断是否有 keyObj,返回boolean值
get(keyObj):和键keyObj关联的值
set(key,value)::添加/修改数据
delete(keyObj):删除键值为keyObj的键值对
size:统计键值对总数
let map=new Map([ ['name','wwww'], ['age',22] ]) console.log(map.size)//2 console.log(map.has('name'))//true console.log(map.get('name'))//www console.log(map.set('name','qqq'))//Map(2) {"name" => "qqq", "age" => 22} map.delete('name')
遍历方式
-
keys() 返回一个新的 Iterator 对象。它包含按照顺序插入 Map 对象中每个元素的 key 值
-
values() 方法返回一个新的 Iterator 对象。它包含按顺序插入Map对象中每个元素的 value 值
-
entries() 方法返回一个新的包含 [key, value] 对的 Iterator ? 对象,返回的迭代器的迭代顺序与 Map
对象的插入顺序相同 -
forEach() 方法将会以插入顺序对 Map 对象中的每一个键值对执行一次参数中提供的回调函数
-
for…of 可以直接遍历每个成员
map.forEach((value, key) => console.log(value, key)) for (let [key, value] of map) { console.log(key, value) } for (let key of map.keys()) { console.log(key) } for (let value of map.values()) { console.log(value) } for (let [key, value] of map.entries()) { console.log(key, value) }
其实 Object 也是按键值对存储和读取的,下面来比较以下Object和Map的区别:
Object | Map |
---|---|
一个Object的键值只能是symbol或者字符串类型 | Map的键值可以为任意类型,例如:函数、对象、基本类型 |
添加到Object中的键是无序的 | Map对象是按插入的顺序返回键值 |
objeck的键值对个数只能手动计算 | Map的键值对个数可以通过size属性得到 |
Object的迭代需要先获取它的键数组再进行迭代 | Map可直接进行迭代 |
- | 在涉及频繁增删改查键值对的场景下有些性能优势 |
weakMap
WeakMap结构与Map结构类似,也是用于生成键值对的集合。
// WeakMap 可以使用 set 方法添加成员 const wm1 = new WeakMap() const key = { foo: 1 } wm1.set(key, 2) wm1.get(key) // 2 // WeakMap 也可以接受一个数组, // 作为构造函数的参数 const k1 = [1, 2, 3] const k2 = [4, 5, 6] const wm2 = new WeakMap([ [k1, 'foo'], [k2, 'bar'] ]) wm2.get(k2) // "bar"
WeakMap与Map的区别就类似于WeakSet与Set的区别。WeakMap与Map的区别有两点。
- WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。
const map = new WeakMap() map.set(1, 2) // TypeError: 1 is not an object! map.set(Symbol(), 2) // TypeError: Invalid value used as weak map key map.set(null, 2) // TypeError: Invalid value used as weak map key
- WeakMap的键名所指向的对象,不计入垃圾回收机制。
垃圾回收机制可以简单理解为对象每被引用一次就会+1 只要对象不为0 就不会被回收 一直+1会造成内存泄漏,而WeakMap就不存在这种垃圾回收机制,即 引用了就为1 没引用就为0 不存在内存泄漏的问题。
相关文章推荐
- 网络数据备份系统结构的几种类型分析
- sdut 2136 数据结构实验之二叉树的建立与遍历(二叉树遍历,叶子数和深度)
- 数据结构课上笔记12
- 关于海量数据处理的各种常用数据结构
- 链表相关的算法题大汇总(2) — 数据结构之链表奇思妙想
- Android8.1_SystemUI_Notification:数据结构优化
- 数据结构(九)
- jdk6标准类库源码解读 之 数据结构 (二) LinkedList
- 数据结构之队列
- 数据结构之图(图的简介)
- 数据结构(算法)
- sdut 数据结构实验之队列一:排队买饭
- sqlserver2000下生成表结构脚本和导入导出数据内容
- 【数据结构】B-Tree, B+Tree, B*树介绍 转
- 数据结构之递归回溯算法
- 结构体数据对齐问题
- Android 偏数据 结构面试题
- SDUT 2136 数据结构实验之二叉树的建立与遍历
- 数据结构概念理解的例子_学习笔记01
- C++数据结构(四)——二叉树