Objects 和 Maps 类似的是,它们都允许你按键存取一个值、删除键、检测一个键是否绑定了值。因此(并且也没有其他内建的替代方式了)过去我们一直都把对象当成 Maps 使用。不过 Maps 和 Objects 有一些重要的区别。
JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。
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) // 123map.set(true, 1);
map.set('true', 2);
map.get(true) // 1map.set(undefined, 3);
map.set(null, 4);
map.get(undefined) // 3map.set(NaN, 123);
map.get(NaN) // 123
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]);
}
一个Object的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值,包括函数、对象、基本类型。
Map 中的键值是有序的,而添加到对象中的键则不是。因此,当对它进行遍历时,Map 对象是按插入的顺序返回键值。
你可以通过 size 属性直接获取一个 Map 的键值对个数,而 Object 的键值对个数只能手动计算。
Map 可直接进行迭代,而 Object 的迭代需要先获取它的键数组,然后再进行迭代。
Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。虽然 ES5 开始可以用 map = Object.create(null) 来创建一个没有原型的对象,但是这种用法不太常见。
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对象中的每个元素 |