何时在 上使用 Map [重复]

Posted

技术标签:

【中文标题】何时在 上使用 Map [重复]【英文标题】:When to use Map over [duplicate]何时在 上使用 Map [重复] 【发布时间】:2017-04-14 09:49:02 【问题描述】:

何时使用 Map over 。可以使用 Map 完成的所有操作也可以使用 i.e. Object 除了设置字符串以外的类型的键之外。

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

当我可以对它们中的任何一个做某事时,应该在什么情况下使用哪种方法。

【问题讨论】:

什么是新的 Map()? @webmaster,不,不是。 抱歉,请忽略@NinaScholz @webmaster 请仔细阅读问题。这个问题是关于 javascript 的 map 对象,而不是 java 的。 是的,是我的错误...... 【参考方案1】:

来自MDN,

一个对象有一个原型,所以地图中有默认键。这 从 ES5 开始可以使用 map = Object.create(null) 绕过,但是 很少做。

Object 的键是 StringsSymbols, 而它们可以是地图的任何值,包括函数、对象、 和/或任何原语。

您可以通过 size 属性,而 Object 的大小必须确定 手动。

映射通常适用于键不是字符串且键值对经常被删除或添加的集合。如果您的键是固定的,那么对象将更适合。

【讨论】:

【参考方案2】:

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

如果你有一个数字,并且一个数字作为字符串,那么对于对象来说,key是一样的(如果不是字符串转换成字符串的话都是get),但是对于map来说,这两个key是不同的,指向不同的价值观。

var m = new Map;
m.set(1, 'number 1');
m.set('1', 'string 1');

console.log(m.get(1));   // 'number 1'
console.log(m.get('1')); // 'string 1'

var o = Object.create(null); // an empty object without prototypes
o[1] = 'number 1';
o['1'] = 'string 1';

console.log(o[1]); // 'string 1'

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

【讨论】:

这只是重复 OP 已经知道的内容("...除了设置字符串以外类型的键" @JJJ 是的,这值得一票,因为 OP 已经知道他自己问题的答案。 当然,如果这是唯一的区别(它不是)并且答案清楚地表明它(它没有)所以我真的不明白它有什么帮助。它甚至没有回答问题(“何时使用地图”)。 @JJJ 这是主要的区别,OP没有问有什么区别。其他差异通常在决定使用哪个差异时影响不大,这是 OP 问题的重点。 @JJJ,不,操作不知道,有什么区别。即使已知差异,其含义也不是。【参考方案3】:

mozilla documentation 已经足够描述了,我相信。

Map 对象是一个简单的键/值映射。任何值(对象和原始值)都可以用作键或值。

比较对象和地图

Objects 与 Maps 类似,都可以让您将键设置为值, 检索这些值,删除键,并检测是否存在 存储在一个键上。因此(并且因为没有内置 替代方案),对象在历史上一直被用作地图;然而, 对象和地图之间存在重要的区别 更好地使用地图:

一个对象有一个原型,所以映射中有默认键。这 从 ES5 开始可以使用 map = Object.create(null) 绕过,但很少这样做。

对象的键是字符串和符号,而它们可以是 Map 的任何值,包括函数、对象和/或任何原语。

您可以使用 size 属性轻松获取 Map 的大小,而 Object 的大小必须手动确定。

这并不意味着你应该在任何地方都使用地图,对象仍然是 大多数情况下使用。地图实例仅对集合有用,并且 你应该考虑在你以前使用过的地方调整你的代码 这样的对象。对象应用作记录,具有字段和 方法。如果您仍然不确定要使用哪一个,请问问自己 以下问题:

密钥在运行时通常是未知的,您是否需要动态查找它们? 是否所有值都具有相同的类型,并且可以互换使用? 您需要不是字符串的键吗? 是否经常添加或删除键值对? 您是否有任意数量(易于更改)的键值对? 集合是否迭代?

这些都是你想要一个集合的地图的迹象。如果在 相比之下,您有固定数量的键,对它们进行操作 分别,并区分它们的用法,那么你想要一个 对象。

【讨论】:

【参考方案4】:

这是我曾经遇到的一个错误:

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 做任何你不能用对象做的事情;但是,如果您不小心并以安全的方式做事(例如在没有 .hasOwnProperty 检查的情况下使用 for...in... 进行迭代),则很容易弄乱对象。

【讨论】:

以上是关于何时在 上使用 Map [重复]的主要内容,如果未能解决你的问题,请参考以下文章

何时使用 ConcurrentHashMap [重复]

在 std::map 和 std::unordered_map 之间进行选择 [重复]

PHP和MySQL中何时使用'@'运算符[重复]

何时使用重复数据删除技术?

何时在 oracle 查询中使用提示 [重复]

何时在 vi/vim 中使用 :abbr 与 :map