es6数据结构Map键值对

Objects 和 Maps 类似的是,它们都允许你按键存取一个值、删除键、检测一个键是否绑定了值。因此(并且也没有其他内建的替代方式了)过去我们一直都把对象当成 Maps 使用。不过 Maps 和 Objects 有一些重要的区别。

JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。

Map基本用法

const map = new Map();

map.set(1, 'aaa')
map.get(1) // "aaa"

如果 Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键

let map = new 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

Map遍历

const map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
]);

for (let key of map.keys()) {
  console.log(key);
}
// "F"
// "T"

for (let value of map.values()) {
  console.log(value);
}
// "no"
// "yes"

for (let item of map.entries()) {
  console.log(item[0], item[1]);
}

Map和Object的区别

  1. 一个Object的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值,包括函数、对象、基本类型。

  2. Map 中的键值是有序的,而添加到对象中的键则不是。因此,当对它进行遍历时,Map 对象是按插入的顺序返回键值。

  3. 你可以通过 size 属性直接获取一个 Map 的键值对个数,而 Object 的键值对个数只能手动计算。

  4. Map 可直接进行迭代,而 Object 的迭代需要先获取它的键数组,然后再进行迭代。

  5. Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。虽然 ES5 开始可以用 map = Object.create(null) 来创建一个没有原型的对象,但是这种用法不太常见。

  6. Map 在涉及频繁增删键值对的场景下会有些性能优势。

Map方法

方法名作用
Map.prototype.clear()删除所有键/值对来自Map对象
Map.prototype.delete(key)删除与该键关联的任何值,并返回Map.prototype.has(key)之前返回的值
Map.prototype.has(key)之后将返回true或false
Map.prototype.entries()返回一个新的Iterator对象,该对象包含一个 [key,value]数组,用于Map对象中的每个元素插入顺序
Map.prototype.forEach(callbackFn [,thisArg])按插入顺序为Map对象中的每个键值对调用 callbackFn 一次.如果向forEach提供thisArg参数,它将被用作每个回调的this值
Map.prototype.keys()按插入顺序返回一个新的Iterator对象,该对象包含Map对象中每个元素的键
Map.prototype.values()以插入顺序返回一个新的Iterator对象,该对象包含 [key,value]数组,用于Map对象中的每个元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上行舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值