何时在 上使用 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 的键是 Strings 和 Symbols, 而它们可以是地图的任何值,包括函数、对象、 和/或任何原语。
您可以通过 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章