Используйте карты поверх объектов, когда ключи неизвестны до времени выполнения, и когда все ключи одного типа и все значения одного типа.
Используйте объекты, когда есть логика, которая работает с отдельными элементами.
Вопрос:
Каков применимый пример использования карт поверх объектов? в частности, «когда ключи будут неизвестны до времени выполнения?»
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));
javascript
ecmascript-6
javascript-objects
Мэтью Харвуд
источник
источник
WeakMap
может быть полезно.name
и,id
например.Ответы:
Я думаю, вы уже привели один хороший пример: вам, по крайней мере, нужно использовать
Map
s, когда вы используете объекты (включая объекты Function) в качестве ключей.Всякий раз, когда они не известны во время компиляции. Короче говоря, вы всегда должны использовать,
Map
когда вам нужна коллекция ключей и значений . Хороший индикатор того, что вам нужна коллекция, - это когда вы динамически добавляете и удаляете значения из коллекции, особенно когда вы не знаете эти значения заранее (например, они считываются из базы данных, вводятся пользователем и т. Д.).Напротив, вам следует использовать объекты, когда вы знаете, какие и сколько свойств имеет объект при написании кода - когда их форма статична. Как сказал @Felix: когда вам нужна запись . Хороший индикатор необходимости, это когда поля имеют разные типы и когда вам никогда не нужно использовать нотацию в скобках (или ожидать в ней ограниченного набора имен свойств).
источник
for..of
), а не на уровне программы (напримерfor..in
), используйтеMap
. Подробнее об этих условиях читайте в этом ответе .Я думаю, что с ES2015 осталось
Map
только две причины использовать простые объекты:Когда порядок собственности не важен?
Promise
- который является прокси для будущего значения - иthen
/catch
)Во всех других случаях вы можете рассмотреть возможность использования
Map
, поскольку он сохраняет порядок свойств и отделяет программу (все свойства, присвоенныеMap
объекту) от уровня данных (все записи в самомMap
себе).В чем недостатки
Map
?источник
Map
вероятно, быстрее, потому что он основан исключительно на хэше, тогда какObject
он немного сложнее. Благодаря!Понятия не имею, почему кто-то написал что-то настолько явно неправильное. Я должен сказать, что в наши дни люди находят на MDN все больше и больше неправильного и / или сомнительного контента.
В этом предложении нет ничего правильного. Основная причина использования карт - это когда вам нужны объектно-значные ключи. Идея о том, что значения должны быть одного типа, абсурдна - хотя, конечно, может быть. Идея о том, что нельзя использовать объекты, когда ключи неизвестны до времени выполнения, также абсурдна.
источник
Map
доступны) - хороший совет.Одно из различий между
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"}
источник
Object
s похожи наMap
s в том, что оба позволяют вам устанавливать ключи для значений, извлекать эти значения, удалять ключи и определять, хранится ли что-то в ключе. Из-за этого (и из-за отсутствия встроенных альтернатив) s историческиObject
использовались какMap
s; однако есть важные отличия, которые делают использованиеMap
в определенных случаях предпочтительным:Object
этоString
s иSymbol
s, тогда как они могут быть любым значением дляMap
, включая функции, объекты и любой примитив.Map
упорядочены, а ключи, добавленные к объекту, нет. Таким образом, при итерации по немуMap
объект возвращает ключи в порядке вставки.Map
с помощьюsize
свойства, в то время как количество свойств в элементеObject
необходимо определять вручную.Map
является итерируемым и, таким образом, может быть повторен напрямую, тогда как итерация по объектуObject
требует некоторого получения его ключей и повторения по ним.Object
есть прототип, поэтому на карте есть ключи по умолчанию, которые могут столкнуться с вашими ключами, если вы не будете осторожны. Начиная с ES5, это можно обойти, используяmap = Object.create(null)
, но это делается редко.Map
может работать лучше в сценариях, включающих частое добавление и удаление пар ключей.MDN
источник
Этот вопрос дублирует но пока он не закроется, вот мой ответ оттуда :
В дополнение к другим ответам я обнаружил, что Карты более громоздки и многословны в работе, чем объекты.
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
Отладка карт также более болезненная. Ниже вы не можете увидеть, какие ключи есть на карте. Для этого вам нужно написать код.
Объекты можно оценивать любой IDE:
источник