何时使用Map over {}。使用{} i.e. Object
也可以实现使用Map完成的所有操作,除了设置除字符串以外的类型键的一件事。
var mp = new Map();
mp.set(1, 'one');
mp.set(2, 'two');
var ob = {};
ob[1] = 'one';
ob[2] = 'two';
console.log(mp);
console.log(mp.get(1));
console.log(typeof mp.keys().next().value);
console.log(ob);
console.log(ob[1]);
console.log(typeof Object.keys(ob)[0]);
输出
Map { 1 => 'one', 2 => 'two' }
one
number
{ '1': 'one', '2': 'two' }
one
string
当我可以用任何一种方法做任何事情时,应该使用哪种方法。
答案 0 :(得分:3)
mozilla documentation足够描述性。
Map对象是一个简单的键/值映射。任何值(对象和原始值)都可以用作键或值。
比较对象和地图
对象类似于Maps,因为它们都允许您将键设置为值, 检索这些值,删除键,并检测是否有 存储在钥匙上。因此(并且因为没有内置的 替代方案),对象历来被用作地图;然而, 对象和地图之间存在重要差异 更好地使用地图:
对象有一个原型,因此地图中有默认键。这个 可以通过使用自ES5以来的map = Object.create(null)来绕过,但很少这样做。
Object的键是字符串和符号,而它们可以是Map的任何值,包括函数,对象和/或任何原语。
- 您可以使用size属性轻松获取Map的大小,而Object的大小必须手动确定。
这并不意味着你应该到处使用地图,对象仍然是 在大多数情况下使用。地图实例仅对集合有用,并且 您应该考虑在以前使用过的地方调整代码 这样的对象。对象应用作记录,包含字段和 方法。如果您仍然不确定使用哪一个,请问问自己 以下问题:
- 在运行之前,密钥通常是未知的,您是否需要动态查找它们?
- 是否所有值都具有相同的类型,并且可以互换使用?
- 您是否需要非字符串的键?
- 是否经常添加或删除键值对?
- 您是否有任意(容易变化)的键值对?
- 集合是否已迭代?
这些都是你想要一个集合的地图的迹象。如果在 对比你有一个固定数量的键,对它们进行操作 单独地,并区分他们的用法,然后你想要一个 对象
答案 1 :(得分:2)
这是我曾经遇到过的一个错误:
var scrabbled = {
The: 6,
word: 8,
length: 10,
is: 2,
weird: 9
};
$.each(scrabbled, function(k, v) {
console.log(k, v);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
(jQuery在1.9中修复了它,但在我终于意识到错误之前,这不是一个有趣的工作日。)
是的,我想如果你把自己局限于字符串索引,那么你无法用Map
做任何你不能用对象做的事情;但是如果你不小心并且以安全的方式做事(比如在没有for...in...
检查的情况下使用.hasOwnProperty
进行迭代),那么很容易搞乱对象。
答案 2 :(得分:2)
来自MDN,
对象有一个原型,因此地图中有默认键。这个 可以通过使用map = Object.create(null)绕过ES5,但是 很少这样做。
对象的键是字符串和符号, 而对于Map,它们可以是任何值,包括函数,对象, 和/或任何原始的。
您可以轻松地获取地图的尺寸 size属性,而必须确定Object的大小 手动
地图通常对于您的密钥不是字符串的集合非常有用,并且通常会删除或添加键值对。如果您的密钥是固定的,那么对象将更适合。
答案 3 :(得分:1)