您的位置:首页 > 理论基础 > 数据结构算法

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 不存在内存泄漏的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: