欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js数据结构之Map

程序员文章站 2022-03-10 23:23:27
...

1. 定义

Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。

键的比较:NaN 是与 NaN 相等的(虽然 NaN !== NaN),剩下所有其它的值是根据=== 运算符的结果判断是否相等。

创建
let map = new Map([iterable])
Iterable 可以是一个数组或者其他 iterable 对象,其元素为键值对(两个元素的数组,例如: [[ 1, ‘one’ ],[ 2, ‘two’ ]])。 每个键值对都会添加到新的 Map。null 会被当做 undefined。例如:

let map = new Map([[1, 2], ['a', 'b']])
console.log(map) // Map(2) {1 => 2, "a" => "b"}

2. Map 和 Object 的比较

Map Object
意外的键 Map 默认情况不包含任何键。只包含显式插入的键。 一个 Object 有一个原型, 原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
键的类型 一个 Map的键可以是任意值,包括函数、对象或任意基本类型。 一个Object 的键必须是一个 String 或是Symbol。
键的顺序 Map 中的 key 是有序的。因此,当迭代的时候,一个 Map 对象以插入的顺序返回键值。 es6之前一个 Object 的键是无序的
Size Map 的键值对个数可以轻易地通过size 属性获取 Object 的键值对个数只能手动计算
迭代 Map 是 iterable 的,所以可以直接被迭代 迭代一个Object需要以某种方式获取它的键然后才能迭代。
性能 在频繁增删键值对的场景下表现更好。 在频繁添加和删除键值对的场景下未作出优化。

3. 属性和方法

Map.prototype.size

返回Map对象的键/值对的数量。

Map.prototype.set(key, value)

设置Map对象中键的值。返回该Map对象。

Map.prototype.get(key)

返回键对应的值,如果不存在,则返回undefined。

Map.prototype.delete(key)

如果 Map 对象中存在该元素,则移除它并返回 true;否则如果该元素不存在则返回 false。随后调用 Map.prototype.has(key) 将返回 false 。

Map.prototype.clear()

移除Map对象的所有键/值对 。

Map.prototype.has(key)

返回一个布尔值,表示Map实例是否包含键对应的值。

Map.prototype.entries()

返回一个新的 Iterator 对象,它按插入顺序包含了Map对象中每个元素的 [key, value] 数组。

Map.prototype.keys()

Map.prototype.values()

Map.prototype.forEach(callbackFn[, thisArg])

let map = new Map()
// 新增
map.set(1, 2) // Map(1) {1 => 2}
map.set('a', 'b') // Map(2) {1 => 2, "a" => "b"}
//  获取长度
map.size // 2
// 键是否存在
map.has(1) // true
//  修改
map.set(1,3) // Map(2) {1 => 3, "a" => "b"}
// 查询
map.get('a') // "b"
// 删除
map.delete(1) // true
// 清空
map.clear() // undefined