使用Map.has()
而不是使用Map
来检查Map.get()
中是否存在密钥是否有优势? (除了代码可读性原因)
我检查了ES2015语言规范,除了返回值外,这两种方法似乎都相同,因此我相信性能是相同的,但是也许我不知道有其他方面会影响此处的性能。
Map.prototype.has(密钥)
采取以下步骤:
让M为this值。如果Type(M)不是Object,则抛出TypeError 例外。如果M没有[[MapData]]内部插槽,则抛出一个 TypeError异常。假设条目是M的值的列表 [[MapData]]内部插槽。对每个记录{[[[key]],[[value]]}重复 p是条目的元素,如果p。[[key]]不为空并且 SameValueZero(p。[[[key]],key)为true,返回true。返回false。
Map.prototype.has method specification
Map.prototype.get(密钥)
采取以下步骤:
让M为this值。如果Type(M)不是Object,则抛出TypeError 例外。如果M没有[[MapData]]内部插槽,则抛出一个 TypeError异常。假设条目是M的值的列表 [[MapData]]内部插槽。对每个记录{[[[key]],[[value]]}重复 p是条目的元素,如果p。[[key]]不为空并且 SameValueZero(p。[[[key]],key)为true,返回p。[[value]]。返回 未定义。
答案 0 :(得分:2)
使用Map.has
的原因之一是,如果密钥恰好存在,但该值是假的。如果您使用Map.get
,还必须检查值=== undefined
(甚至不能保证该键不存在-该键可能存在,但是值{{ 1}}):
undefined
// Not good enough:
const map = new Map();
map.set('foo', 0);
if (map.get('foo')) {
console.log('Map has "foo" key');
}
// Better, but not foolproof:
const map = new Map();
map.set('foo', 0);
map.set('bar', undefined);
const valAtFoo = map.get('foo');
if (valAtFoo !== undefined) {
console.log('Map has "foo" key');
}
// Incorrect:
const valAtBar = map.get('bar');
if (valAtBar !== undefined) {
console.log('Map has "bar" key');
}
使用// Solution: use map.has instead of map.get
const map = new Map();
map.set('foo', 0);
map.set('bar', undefined);
if (map.has('foo')) {
console.log('Map has "foo" key');
}
if (map.has('bar')) {
console.log('Map has "bar" key');
}
的原因与使用Map.has
检查对象是否具有特定属性的原因相同-使用Object.prototype.hasOwnProperty
检查obj[prop]
是否存在在某些情况下还不够好。
这不是性能问题,而是因为在某些情况下,没有其他方法。 (prop
也更具可读性,尽管您说过忽略了该部分)