この文書は翻訳中です。他国語のままの部分などがあるのはその為です。
是非お気軽に MDN に登録して翻訳に参加し、私たちの手助けをして下さい!
これは実験段階の機能です。
この機能は複数のブラウザで開発中の状態にあります。各ブラウザで用いるために、適切なベンダー接頭辞が必要な場合があります。互換性テーブルをチェックしてください。また、実験段階の機能の構文と挙動は、仕様変更に伴い各ブラウザの将来のバージョンで変更になる可能性があることに注意してください。
警告: The SpiderMonkey Map implementation is a prototype and the Map API and semantics specifications are unstable. The SpiderMonkey implementation may not reflect the latest specification draft. It is subject to change anytime. It is provided as an experimental feature. Do not rely on it for production code.
Introduction
Map
オブジェクトはシンプルなキーバリューマップです。 キーとバリューにあらゆる値(オブジェクトとプリミティブ値)が使用できます。
Key equality is based on the "same-value" algorithm: NaN
is considered the same as NaN
(even though NaN !== NaN
), -0
and +0
are considered distinct (even though -0 === +0
), and all other values are considered equal according to the semantics of the === operator.
API
Constructor | Description |
---|---|
new Map([iterable]) |
Returns a new Map object. If iterable is an Array or other iterable object whose elements are key-value pairs (2-element Arrays), then each of those key-value pairs will be added to the new Map. |
Method | Description |
myMap.get(key) |
Returns the value associated to the key , or undefined if there is none. |
myMap.set(key, value) |
Sets the value for the key in myMap . Returns undefined . |
myMap.has(key) |
Returns a boolean asserting whether a value has been associated to the key in myMap or not |
myMap.delete(key) |
Removes any value associated to the key . After such a call, myMap.has(key) will return false . |
myMap.clear() |
Removes all key/value pairs from myMap . |
Property | Description |
myMap.size |
Returns the number of key/value pairs in size was a method. In Firefox 19 and later it is a property. |
A Map object can iterate its elements in insertion order - a for..of
loop will return an array of [key, value]
for each iteration.
Examples
var myMap = new Map(); var keyObj = {}, keyFunc = function () {}, 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"); myMap.size; // 3 // getting the values myMap.get(keyString); // "value associated with 'a string'" myMap.get(keyObj); // "value associated with keyObj" myMap.get(keyFunc); // "value associated with keyFunc" myMap.get("a string"); // "value associated with 'a string'" // because keyString === 'a string' myMap.get({}); // undefined, because keyObj !== {} myMap.get(function() {}) // undefined, because keyFunc !== function () {}
NaN
can also be used as a key. Even though every NaN
is not equal to itself (NaN !== NaN
is true), the following example works, because NaN
s are indistinguishable from each other:
var myMap = new Map(); myMap.set(NaN, "not a number"); myMap.get(NaN); // "not a number" var otherNaN = Number("foo"); myMap.get(otherNaN); // "not a number"
Also note that JavaScript has two zero values, +0 and -0. These two zero values are treated as different keys in Map
s:
var myMap = new Map(); myMap.set(0, "positive zero"); myMap.set(-0, "negative zero"); 0 === -0; // true myMap.get(-0); // "negative zero" myMap.get(0); // "positive zero"
Maps can be iterated using a for..of
loop:
var myMap = new Map(); myMap.set(0, "zero"); myMap.set(1, "one"); for (var [key, value] of myMap) { alert(key + " = " + value); } // Will show 2 alerts; first with "0 = zero" and second with "1 = one"
Objects and maps compared
Object
s are similar to Map
s in that both let you set keys to values, retrieve those values, delete keys, and detect whether something is stored at a key. Because of this, Object
s have been used as Map
s historically; however, there are important differences between Object
s and Map
s that make using a Map
better.
- An
Object
has a prototype, so there are default keys in the map. However, this can be bypassed usingmap = Object.create(null)
. - The keys of an
Object
are Strings, where they can be any value for aMap
. - You can get the size of a
Map
easily while you have to manually keep track of size for anObject
.
Use maps over objects when keys are unknown until run time, and when all keys are the same type and all values are the same type.
Use objects when there is logic that operates on individual elements.
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 31 [1] | 13 (13) | 未サポート | 未サポート | 未サポート |
iterable | 未サポート | 17 (17) | 未サポート | 未サポート | 未サポート |
Map.clear() | 31 [1] | 19 (19) | 未サポート | 未サポート | 未サポート |
Feature | Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
Basic support | 未サポート | 13.0 (13) | 未サポート | 未サポート | 未サポート |
iterable | 未サポート | 17 (17) | 未サポート | 未サポート | 未サポート |
Map.clear() | 未サポート | 19.0 (19) | 未サポート | 未サポート | 未サポート |
[1] The feature is available behind a preference. In chrome://flags
, activate the entry “Enable Experimental JavaScript”.