何时使用Map over {}

时间:2016-11-30 06:59:13

标签: javascript

何时使用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

当我可以用任何一种方法做任何事情时,应该使用哪种方法。

4 个答案:

答案 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)

区别在于Object有字符串作为键,而Map可以包含任何类型的键。

如果你有一个数字,一个数字作为字符串,那么对于对象,键是相同的(如果它们不是转换为字符串的字符串则得到),但是对于地图,这两个键是不同的并指向不同的值。

//bg.R=255, bg.G=255, bg.B=255
bgDelta=76.245 + 149.685 + 29.07= 255
105 - bgDelta=-150
result=Color.Black

在地图上使用对象的主要原因是,对象适用于每个系统,而映射仅适用于较新的浏览器,至少在ES6正在工作时。