Map.has与Map.get

时间:2019-06-25 06:10:19

标签: javascript performance ecmascript-6

使用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]]。返回   未定义。

Map.prototype.get method specification

1 个答案:

答案 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也更具可读性,尽管您说过忽略了该部分)