Use mapas sobre objetos quando as chaves forem desconhecidas até o tempo de execução e quando todas as chaves forem do mesmo tipo e todos os valores forem do mesmo tipo.
Use objetos quando houver lógica que opera em elementos individuais.
Questão:
Qual é um exemplo aplicável de uso de mapas sobre objetos? em particular, "quando as chaves seriam desconhecidas até o tempo de execução?"
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
Matthew Harwood
fonte
fonte
WeakMap
que também pode ser útil.name
e,id
por exemplo.Respostas:
Acho que você já deu um bom exemplo: você pelo menos precisa usar
Map
s quando estiver usando objetos (incluindo objetos Function) como chaves.Sempre que não forem conhecidos em tempo de compilação. Resumindo, você sempre deve usar um
Map
quando precisar de uma coleção de valores-chave . Um bom indicador de que você precisa de uma coleção é quando você adiciona e remove valores dinamicamente da coleção, e especialmente quando você não conhece esses valores de antemão (por exemplo, eles são lidos de um banco de dados, inseridos pelo usuário, etc).Em contraste, você deve usar objetos quando sabe quais e quantas propriedades o objeto tem enquanto escreve o código - quando sua forma é estática. Como @Felix colocou: quando você precisar de um registro . Um bom indicador para isso é quando os campos têm tipos diferentes e quando você nunca precisa usar a notação de colchetes (ou esperar um conjunto limitado de nomes de propriedades nela).
fonte
for..of
) em vez de no nível do programa (por exemplofor..in
), use aMap
. Mais informações sobre estes termos nesta resposta .Eu acho que com o ES2015
Map
apenas duas razões são deixadas para usar objetos simples:Quando a ordem de propriedade não é importante?
Promise
- que é um proxy para um valor futuro - ethen
/catch
)Em todos os outros casos, você pode considerar o uso
Map
, porque preserva a ordem das propriedades e separa o programa (todas as propriedades atribuídas aoMap
objeto) do nível de dados (todas as entradas noMap
próprio).Quais são as desvantagens de
Map
?fonte
Map
é provavelmente mais rápido, porque é baseado puramente em um hash, enquantoObject
é um pouco mais complicado. Obrigado!Não tenho ideia de por que alguém escreveria algo tão obviamente errado. Devo dizer que as pessoas estão encontrando cada vez mais conteúdo errado e / ou questionável no MDN atualmente.
Nada nessa frase está correto. O principal motivo para usar mapas é quando você deseja chaves com valor de objeto. A ideia de que os valores devam ser do mesmo tipo é absurda - embora possam ser, é claro. A ideia de que não se deve usar objetos quando as chaves são desconhecidas até o tempo de execução é igualmente absurda.
fonte
Map
disponível) é um bom conselho.Uma das diferenças entre
Map
eObject
é:Map
pode usar tipos de dados complexos como sua chave. como isso:const fn = function() {} const m = new Map([[document.body, 'stackoverflow'], [fn, 'redis']]); m.get(document.body) // 'stackoverflow' m.get(fn) //'redis'
cuidado: Para tipos de dados complexos, se você deseja obter o valor, deve passar a mesma referência da chave.
Object
, ele aceita apenas o tipo de dados simples (number
,string
) como sua chave.const a = {}; a[document.body] = 'stackoverflow'; console.log(a) //{[object HTMLBodyElement]: "stackoverflow"}
fonte
Esta pergunta é uma duplicata de mas até que seja fechado, aqui está minha resposta de lá :
Além das outras respostas, descobri que a operação com mapas é mais complicada e prolixa do que com objetos.
obj[key] += x // vs. map.set(map.get(key) + x)
Isso é importante porque um código mais curto é mais rápido de ler, mais diretamente expressivo e melhor guardado na cabeça do programador .
Outro aspecto: como set () retorna o mapa, não o valor, é impossível encadear as atribuições.
foo = obj[key] = x; // Does what you expect foo = map.set(key, x) // foo !== x; foo === map
Depurar mapas também é mais doloroso. Abaixo, você não pode realmente ver quais chaves estão no mapa. Você teria que escrever um código para fazer isso.
Os objetos podem ser avaliados por qualquer IDE:
fonte
Object
s são semelhantes aMap
s no sentido de que ambos permitem definir chaves para valores, recuperar esses valores, excluir chaves e detectar se algo está armazenado em uma chave. Por causa disso (e porque não havia alternativas integradas),Object
s têm sido usados comoMap
s historicamente; no entanto, existem diferenças importantes que tornam o uso de umMap
preferível em certos casos:Object
sãoString
s eSymbol
s, enquanto podem ser qualquer valor para aMap
, incluindo funções, objetos e qualquer primitivo.Map
são ordenadas, enquanto as chaves adicionadas ao objeto não. Assim, ao iterar sobre ele, umMap
objeto retorna chaves na ordem de inserção.Map
facilmente com asize
propriedade, enquanto o número de propriedades em umObject
deve ser determinado manualmente.Map
é iterável e, portanto, pode ser iterado diretamente, ao passo que iterar sobre umObject
requer a obtenção de suas chaves de alguma forma e a iteração sobre elas.Object
tem um protótipo, portanto, há chaves padrão no mapa que podem colidir com suas chaves se você não tomar cuidado. No ES5, isso pode ser contornado usandomap = Object.create(null)
, mas raramente é feito.Map
pode ter um desempenho melhor em cenários que envolvem adição e remoção freqüentes de pares de chaves.MDN
fonte