it-swarm.com.ru

Карты против объектов в ES6, когда использовать?

Ссылка: MDN Maps

Используйте карты над объектами, когда ключи неизвестны до времени выполнения и когда все ключи имеют одинаковый тип и все значения имеют одинаковый тип.

Используйте объекты, когда есть логика, которая работает с отдельными элементами.

Вопрос:

Каков применимый пример использования Карт над объектами? в частности, "когда ключи будут неизвестны до времени выполнения?"

var myMap = new Map();

var keyObj = {},
    keyFunc = function () { return 'hey'},
    keyString = "a string";

// setting the values
myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

console.log(myMap.get(keyFunc));
73
Matthew Harwood

Что является применимым примером использования Карт над объектами?

Я думаю, что вы уже привели один хороший пример: по крайней мере, вам нужно использовать Maps, когда вы используете объекты (включая объекты Function) в качестве ключей.

в частности, "когда ключи будут неизвестны до времени выполнения?"

Всякий раз, когда они не известны во время компиляции. Короче говоря, вы всегда должны использовать Map, когда вам нужно ключ-значение collection . Хороший индикатор того, что вам нужна коллекция, - это когда вы динамически добавляете и удаляете значения из коллекции, особенно если вы заранее не знаете эти значения (например, они считываются из базы данных, вводятся пользователем и т.д.).

Напротив, вы должны использовать объекты, когда вы знаете, какими и какими свойствами обладает объект во время написания кода - когда их форма статична. Как сказал @Felix: когда вам нужна запись . Хороший индикатор для этого необходим, когда поля имеют разные типы и когда вам никогда не нужно использовать скобочную запись (или ожидать ограниченного набора имен свойств в ней).

42
Bergi

Я думаю, что с ES2015 Map осталось только две причины использовать простые объекты:

Когда порядок собственности не важен?

  • если у вас есть только одно значение и некоторые функции, которые должны быть явно связаны с ним (например, Promise - который является прокси для будущего значения - и then/catch)
  • если у вас есть структура данных, похожая на структуру/запись со статическим набором свойств, известных во время компиляции (обычно структуры/записи не повторяются)

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

Каковы недостатки Map?

  • вы теряете краткий объект буквальный синтаксис
  • вам нужны пользовательские заменители для JSON.stringyfy
  • вы теряете деструктуризацию, которая в любом случае более полезна для статических структур данных
24
user6445533

Используйте карты над объектами, когда ключи неизвестны до времени выполнения, и когда все ключи имеют одинаковый тип и все значения имеют одинаковый тип.

Я понятия не имею, почему кто-то написал бы что-то так явно неправильно. Я должен сказать, что в наши дни люди все чаще находят неправильный и/или сомнительный контент на MDN.

Ничто в этом предложении не является правильным. Основная причина использования карт - когда вам нужны ключи с объектными значениями. Идея о том, что значения должны быть одного типа, абсурдна, хотя, конечно, они могут быть. Идея, что не следует использовать объекты, когда ключи неизвестны до времени выполнения, в равной степени абсурдна.

9
user663031

Одно из различий между Map и Object заключается в следующем:

Map может использовать сложный тип данных в качестве своего ключа. как это:

const fn = function() {}
const m = new Map([[document.body, 'stackoverflow'], [fn, 'redis']]);

m.get(document.body) // 'stackoverflow'
m.get(fn) //'redis'

Осторожно: Для сложного типа данных, если вы хотите получить значение, вы должны передать ту же ссылку, что и ключ.

Object, он принимает только простой тип данных (number, string) в качестве своего ключа.

const a = {};
a[document.body] = 'stackoverflow';

console.log(a) //{[object HTMLBodyElement]: "stackoverflow"}
3
slideshowp2

Этот вопрос является дубликатом но пока он не закрыт, вот мой ответ оттуда :

В дополнение к другим ответам я обнаружил, что Карты более громоздкие и многословные для работы, чем объекты.

obj[key] += x
// vs.
map.set(map.get(key) + x)

Это важно, потому что более короткий код быстрее читается, более выразителен и лучше хранится в голове программиста .

Другой аспект: так как set () возвращает карту, а не значение, невозможно связать назначения.

foo = obj[key] = x;  // Does what you expect
foo = map.set(key, x)  // foo !== x; foo === map

Отладка карт также более болезненна. Ниже вы не можете увидеть, какие ключи на карте. Вы должны написать код, чтобы сделать это.

 Good luck evaluating a Map Iterator

Объекты могут быть оценены любой IDE:

 WebStorm evaluating an object

2
Dan Dascalescu

Objects похожи на Maps в том, что оба позволяют вам устанавливать ключи к значениям, извлекать эти значения, удалять ключи и определять, сохраняется ли что-то в ключе. Из-за этого (и из-за отсутствия встроенных альтернатив) Objects исторически использовались как Maps; однако существуют важные различия, которые делают использование Map предпочтительным в некоторых случаях:

  • Ключами Object являются Strings и Symbols, тогда как они могут быть Любым значением для Map, включая функции, объекты и любой примитив.
  • Ключи в Map упорядочены, а ключи, добавленные в объект, - нет. Таким образом, При его итерации объект Map возвращает ключи в порядке вставки
  • Вы можете легко получить размер Map с помощью свойства size, тогда как Число свойств в Object должно быть определено вручную.
  • Map является итеративным и, таким образом, может быть непосредственно итерирован, тогда как Итерация по Object требует получения его ключей некоторым образом .__ и итерацию по ним.
  • У Object есть прототип, поэтому на карте есть ключи по умолчанию, которые Могут столкнуться с вашими ключами, если вы не будете осторожны. Начиная с ES5 это Можно обойти с помощью map = Object.create(null), но это Редко делается.
  • Map может работать лучше в сценариях, включающих частое добавление и Удаление пар ключей.

MDN

0
John Kennedy