Разница в производительности между Map.has и Map.get - PullRequest
1 голос
/ 25 июня 2019

Есть ли преимущество в использовании 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 (стр. [[Ключ]], ключ) равно true, возвращает true. Вернуть false.

Спецификация метода Map.prototype.has

Map.prototype.get (ключ)

Выполнены следующие шаги:

Пусть M будет значением this. Если Type (M) не является Object, бросить TypeError исключение. Если у M нет внутреннего слота [[MapData]], бросьте Исключение TypeError. Пусть записи будут списком, который является значением M [[MapData]] внутренний слот. Повторите для каждой записи {[[key]], [[value]]} p, который является элементом записей, если p. [[key]] не является пустым и SameValueZero (стр. [[Ключ]], ключ) имеет значение true, возвращает стр. [[Значение]]. Вернуть не определено.

Спецификация метода Map.prototype.get

1 Ответ

2 голосов
/ 25 июня 2019

Одной из причин, по которой 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');
}

// 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 существует, просто не достаточно хорош в некоторых случаях.

Это не проблема производительности, скорее потому, что в некоторых случаях просто нет другого пути .(.has также более читабелен, хотя вы сказали, что игнорируете эту часть)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...