--- title: Map slug: Web/JavaScript/Reference/Global_Objects/Map tags: - Class - ECMAScript 2015 - JavaScript - Map - Reference - Polyfill browser-compat: javascript.builtins.Map --- {{JSRef}} O objeto **`Map`** contém pares de chave-valor e lembra a ordem original da inserção das chaves. Qualquer valor (objetos e {{glossary("Primitive", "valores primitivos")}}) podem ser usados como chave ou valor. {{EmbedInteractiveExample("pages/js/map.html", "taller")}} ## Descrição Um objeto `Map` itera seus elementos na order da inserção - um loop {{jsxref("Statements/for...of", "for...of")}} retorna um array de `[key, value]` para cada iteração ### Igualdade de chaves - A igualdade de chaves é baseada no algoritimo [`sameValueZero`](/pt-BR/docs/Web/JavaScript/Equality_comparisons_and_sameness#same-value-zero_equality). - O {{jsxref("NaN")}} é considerado o mesmo que o `NaN` (apesar de `NaN !== NaN`) e todos os outros valores são considerados de acordo com a semântica do operador `===`. - Na especificação atual do ECMAScript, `-0` e `+0` são considerados iguais, embora não tenha sido nos esboços anteriores. Veja _"Equivalência de valor entre -0 e 0"_ em [Compatibilidade com navegadores](#browser_compatibility) para mais detalhes; ### Objetos vs. Maps Um {{jsxref("Object")}} é similar o `Map` - ambos permitem que valores sejam definidos a chaves, retornar esses valores, remover as chaves, e detectar se algo está armazenado na chave. Por esta razão (e porque não existem outras alternativas construídas), o `Objeto` tem sido usado como `Map` historicamente. Porém, existem diferenças importantes que fazem o `Map` ser preferido em alguns casos:
| Map | Objeto | |
|---|---|---|
| Chaves acidentais |
O Map não contém nenhuma chave por padrão. Ele só contém o que é definido explicitamente nele.
|
Um Note: Apartir do ES5, isso pode ser ignorado com o {{jsxref("Object.create", "Object.create(null)")}}, mas isso raramente é feito. |
| Tipos das chaves |
As chaves do Map podem ser qualquer valor (incluindo funções, objetos, ou qualquer outro tipo primitivo).
|
A chave de um Objeto deve ser uma {{jsxref("String")}} ou um {{jsxref("Symbol")}}.
|
| Ordem das chaves |
As chaves dentro do |
Embora as chaves de um
A ordem foi definida primeiramente para suas próprias propriedades apenas no ECMAScript 2015; no ECMAScript 2020 a ordem definida é por propriedades herdadas também.
Veja o
OrdinaryOwnPropertyKeys
e
numerateObjectProperties
operações de especificações abstraídas. Mas note que nenhum mecanismo itera todas as propriedades do objeto; cada um dos vários mecanismos incluem diferentes subconjuntos de propriedades.
({{jsxref("Statements/for...in",
"for-in")}}
incluí apenas propriedades enumeráveis com chaves do tipo string
{{jsxref("Object.keys")}} inclui apenas chaves próprias e enumeráveis do tipo string;
{{jsxref("Object.getOwnPropertyNames")}} incluí o próprio, e propriedades com chaves do tipo string, mesmo que não enumeráveis
{{jsxref("Object.getOwnPropertySymbols")}} faz o mesmo só que para
propriedades |
Tamanho |
O número de items dentro de um Map
é facilmente retornado pela propriedade {{jsxref("Map.prototype.size", "size")}}
|
O número de items dentro de um Objeto deve ser determinado manualmente
|
| Iteração |
Um Map é {{jsxref("Iteration_protocols", "iterável")}}, então ele pode ser diretamente iterável
|
O Nota:
|
| Performance |
Perfoma melhor em cenários envolvendo adições e remoções frequentes em pares chave-valor. |
Não é otimizado para adições e remoções frequentes de pares chave-valor. |
| Serialização e análise sintática |
Não há suporte nativo para a serialização ou análise sintática.
(Mas você pode construir sua própria serialização e conversão para o |
Suporte nativo para serialização de {{jsxref("Object", "Objeto")}} para JSON, usando {{jsxref("JSON.stringify()")}}. Suporte nativo para conversão de JSON para {{jsxref("Object", "Objeto")}} usando {{jsxref("JSON.parse()")}}. |