Map.has 与 Map.get 之间的性能差异

Avi*_*sho 3 javascript performance ecmascript-6

Map.has()用于检查 key 是否存在Map而不是 using有什么好处Map.get()吗?(代码可读性原因除外)

我检查了 ES2015 语言规范,除了返回值外,两种方法似乎都相同,所以我相信性能是相同的,但也许还有一些我不知道的其他方面会影响这里的性能。

Map.prototype.has ( key )

采取以下步骤:

令 M 为 this 值。如果 Type(M) 不是 Object,则抛出 TypeError 异常。如果 M 没有 [[MapData]] 内部槽,则抛出 TypeError 异常。让条目成为列表,它是 M 的 [[MapData]] 内部槽的值。对作为条目元素的每个记录 {[[key]], [[value]]} p 重复,如果 p.[[key]] 不为空并且 SameValueZero(p.[[key]], key) 是真,返回真。返回假。

Map.prototype.has 方法规范

Map.prototype.get ( key )

采取以下步骤:

令 M 为 this 值。如果 Type(M) 不是 Object,则抛出 TypeError 异常。如果 M 没有 [[MapData]] 内部槽,则抛出 TypeError 异常。让条目成为列表,它是 M 的 [[MapData]] 内部槽的值。对作为条目元素的每个记录 {[[key]], [[value]]} p 重复,如果 p.[[key]] 不为空并且 SameValueZero(p.[[key]], key) 是真,返回 p.[[value]]。返回未定义。

Map.prototype.get 方法规范

Cer*_*nce 8

Map.has更可取的原因之一是如果键恰好存在,但值是假的。如果您使用Map.get,您还必须检查该值是否存在=== undefined(即使这样也不能保证该键不存在——该键可能存在,但其值为undefined):

// Not good enough:
const map = new Map();
map.set('foo', 0);
if (map.get('foo')) {
  console.log('Map has "foo" key');
}
Run Code Online (Sandbox Code Playgroud)

// 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');
}
Run Code Online (Sandbox Code Playgroud)

// 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');
}
Run Code Online (Sandbox Code Playgroud)

您将Map.has出于与Object.prototype.hasOwnProperty用于检查对象是否具有特定属性的相同原因使用 -用于检查在某些情况下obj[prop]是否prop存在不够好。

这不是性能问题——而是因为在某些情况下,别无他法。(.has虽然你说忽略那部分,但也更具可读性)