mozilla

Revision 448773 of Map

  • Revision slug: JavaScript/Reference/Global_Objects/Map
  • Revision title: Map
  • Revision id: 448773
  • Created:
  • Creator: zhangyaochun1987
  • Is current revision? No
  • Comment

Revision Content

{{harmony}}

{{ warning("SpiderMonkey中的Map实现是一个原型,并且Map相关的API与语义规范都是不稳定的.SpiderMonkey的Map实现可能不符合最新的ES规范,可能随时会被修改.这是一个试验性质的特性,所以不要在生产环境中使用它.") }}

概述

Map对象就是简单的键/值映射.其中键和值可以是任意值(原始值或对象值).

在判断两个值是否为同一个键的时候,使用的并不是===运算符,而是使用了一种称之为"same-value"的内部算法, 该算法很特殊, 对于Map对象来说, +0 (按照以往的经验与 -0 是严格相等的)和-0 是两个不同的键. 而NaN在作为Map对象的键时和另外一个NaN是一个相同的键(尽管NaN !== NaN).

API

Constructor 描述
new Map([iterable])

返回一个新的Map对象。如果参数iterable是一个数组或者其他可迭代的对象--它的元素是键值对,这样这些的每一个键值对都可以添加到新的Map里面去

方法 描述
myMap.get(key) 返回键key关联的值,如果该键不存在则返回undefined .
myMap.set(key, value) 设置键keymyMap中的值为value.返回 undefined.
myMap.has(key) 返回一个布尔值,表明键key是否存在于myMap 中.
myMap.delete(key) 删除键 key 及对应的值. 在这之后, myMap.has(key)将返回 false
myMap.clear() {{ fx_minversion_inline("19") }} 清空myMap中的所有键值对.
属性 描述
myMap.size

返回myMap中键值对的数量.

{{ fx_minversion_inline("19") }}在Firefox 18及之前版本中,size()是个方法.从Firefox 19开始,size成了属性.

例子

var myMap = new Map();
 
var keyObj = {},
    keyFunc = function () {},
    keyString = "a string";
 
// 添加键
myMap.set(keyString, "和键'a string'关联的值");
myMap.set(keyObj, "和键keyObj关联的值");
myMap.set(keyFunc, "和键keyFunc关联的值");
 
myMap.size; // 3
 
// 读取值
myMap.get(keyString);    // "和键'a string'关联的值"
myMap.get(keyObj);       // "和键keyObj关联的值"
myMap.get(keyFunc);      // "和键keyFunc关联的值"
 
myMap.get("a string");   // "和键'a string'关联的值"
                         // 因为keyString === 'a string'
myMap.get({});           // undefined, 因为keyObj !== {}
myMap.get(function() {}) // undefined, 因为keyFunc !== function () {}

NaN 也可以作为Map对象的键. 虽然 NaN 和任何值甚至和自己都不相等(NaN !== NaN 返回true), 但下面的例子表明, 两个NaN作为Map的键来说是没有区别的:

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"

JavaScript有两个0值,+0和-0.虽然+0 === -0,但是当这两个0作为Map的键时,被认为是两个不同的值.

var myMap = new Map();
myMap.set(0, "正零");
myMap.set(-0, "负零");
 
0 === -0; // true
 
myMap.get(-0); // "负零"
myMap.get(0);  // "正零"

Object和Map的比较

ObjectMap类似的一点是,它们都允许你按键存取一个值,都可以删除键,还可以检测一个键是否绑定了值.因此,一直以来,我们都把对象当成Map来使用,不过,现在有了Map,下面的区别解释了为什么使用Map更好点.

  • 一个对象通常都有自己的原型,所以一个对象总有一个"prototype"键.不过,现在可以使用map = Object.create(null)来创建一个没有原型的对象.
  • 一个对象的键只能是字符串,但一个Map的键可以是任意值.
  • 你可以很容易的得到一个Map的键值对个数,而只能跟踪一个对象的键值对个数

浏览器兼容性

{{ CompatibilityTable() }}

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support {{ CompatNo() }} {{ CompatGeckoDesktop("13") }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }}
iterable {{ CompatNo() }} {{ CompatGeckoDesktop("17") }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }}
Map.clear() {{ CompatNo() }} {{CompatGeckoDesktop("19")}} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }}
Feature Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support {{ CompatNo() }} {{ CompatGeckoMobile("13") }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }}
iterable {{ CompatNo() }} {{ CompatGeckoDesktop("17") }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }}
Map.clear() {{ CompatNo() }} {{CompatGeckoMobile("19")}} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }}

相关链接

Revision Source

<div>
  {{harmony}}</div>
<p>{{ warning("SpiderMonkey中的Map实现是一个原型,并且Map相关的API与语义规范都是不稳定的.SpiderMonkey的Map实现可能不符合最新的ES规范,可能随时会被修改.这是一个试验性质的特性,所以不要在生产环境中使用它.") }}</p>
<h2 id=".E6.A6.82.E8.BF.B0">概述</h2>
<p><code>Map</code>对象就是简单的键/值映射.其中键和值可以是任意值(原始值或对象值).</p>
<p>在判断两个值是否为同一个键的时候,使用的并不是===运算符,而是使用了一种称之为"same-value"的内部算法, 该算法很特殊, 对于Map对象来说, <code>+0</code> (按照以往的经验与 <code>-0 是严格相等的</code>)和<code>-0</code> 是两个不同的键. <code>而NaN</code>在作为Map对象的键时和另外一个NaN是一个相同的键(尽管NaN !== NaN).</p>
<h2 id="API">API</h2>
<table class="standard-table" style="border-spacing: 0px; margin: 0px 0px 1.286em;">
  <tbody>
    <tr>
      <th style="font-style: inherit;">Constructor</th>
      <th style="font-style: inherit;">描述</th>
    </tr>
    <tr>
      <td><code style="font-style: inherit;">new Map([iterable])</code></td>
      <td>
        <p>返回一个新的Map对象。如果参数iterable是一个数组或者其他可迭代的对象--它的元素是键值对,这样这些的每一个键值对都可以添加到新的Map里面去</p>
      </td>
    </tr>
  </tbody>
</table>
<table class="standard-table">
  <tbody>
    <tr>
      <th>方法</th>
      <th>描述</th>
    </tr>
    <tr>
      <td><code>myMap.get(key)</code></td>
      <td>返回键<code>key关联的值</code>,如果该键不存在则返回<code>undefined</code> .</td>
    </tr>
    <tr>
      <td><code>myMap.set(key, value)</code></td>
      <td>设置键<code>key</code>在<code>myMap</code>中的值为<code>value</code>.返回 <code>undefined</code>.</td>
    </tr>
    <tr>
      <td><code>myMap.has(key)</code></td>
      <td>返回一个布尔值,表明键<code>key</code>是否存在于<code>myMap</code> 中.</td>
    </tr>
    <tr>
      <td><code>myMap.delete(key)</code></td>
      <td>删除键 <code>key</code> 及对应的值. 在这之后, <code>myMap.has(key)</code>将返回 <code>false</code></td>
    </tr>
    <tr>
      <td><code>myMap.clear()</code></td>
      <td>{{ fx_minversion_inline("19") }} 清空<code>myMap中的所有键值对</code>.</td>
    </tr>
    <tr>
      <th>属性</th>
      <th>描述</th>
    </tr>
    <tr>
      <td><code>myMap.size</code></td>
      <td>
        <p>返回<code>myMap中键值对的数量</code>.</p>
        {{ fx_minversion_inline("19") }}在Firefox 18及之前版本中,<code>size()是个方法</code>.从Firefox 19开始,size成了属性.</td>
    </tr>
  </tbody>
</table>
<h2 id=".E4.BE.8B.E5.AD.90">例子</h2>
<pre class="brush: js">
var myMap = new Map();
&nbsp;
var keyObj = {},
&nbsp;&nbsp;&nbsp; keyFunc = function () {},
&nbsp;&nbsp;&nbsp; keyString = "a string";
&nbsp;
// 添加键
myMap.set(keyString, "和键'a string'关联的值");
myMap.set(keyObj, "和键keyObj关联的值");
myMap.set(keyFunc, "和键keyFunc关联的值");
&nbsp;
myMap.size; // 3
&nbsp;
// 读取值
myMap.get(keyString);&nbsp;&nbsp;&nbsp; // "和键'a string'关联的值"
myMap.get(keyObj);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // "和键keyObj关联的值"
myMap.get(keyFunc);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // "和键keyFunc关联的值"
&nbsp;
myMap.get("a string");&nbsp;&nbsp; // "和键'a string'关联的值"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 因为keyString === 'a string'
myMap.get({});&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // undefined, 因为keyObj !== {}
myMap.get(function() {}) // undefined, 因为keyFunc !== function () {}</pre>
<p><code>NaN</code> 也可以作为Map对象的键. 虽然 <code>NaN</code> 和任何值甚至和自己都不相等(<code>NaN !== NaN</code> 返回true), 但下面的例子表明, <code>两个NaN</code>作为Map的键来说是没有<span><span>区别的</span></span>:</p>
<pre class="brush: js">
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"
</pre>
<p>JavaScript有两个0值,+0和-0.虽然+0 === -0,但是当这两个0作为Map的键时,被认为是两个不同的值.</p>
<pre class="brush: js">
var myMap = new Map();
myMap.set(0, "正零");
myMap.set(-0, "负零");
&nbsp;
0 === -0; // true
&nbsp;
myMap.get(-0); // "负零"
myMap.get(0);&nbsp; // "正零"</pre>
<h2 id="Object.E5.92.8CMap.E7.9A.84.E6.AF.94.E8.BE.83">Object和Map的比较</h2>
<p><a href="../../../../JavaScript/Reference/Global_Objects/Object" title="en/JavaScript/Reference/Global_Objects/Object"><code>Object</code></a>和<code>Map类似</code>的一点是,它们都允许你按键存取一个值,都可以删除键,还可以检测一个键是否绑定了值.因此,一直以来,我们都把对象当成<code>Map</code>来使用,不过,现在有了<code>Map,</code><code>下面的区别解释了为什么</code>使用<code>Map更好</code>点.</p>
<ul>
  <li>一个<code>对象通常都有自己的原型</code>,所以一个对象总有一个"prototype"键.不过,现在可以使用<code>map = Object.create(null)</code>来创建一个没有原型的对象.</li>
  <li>一个对象的键只能是字符串,但一个<code>Map的键可以是任意值</code>.</li>
  <li>你可以很容易的得到一个<code>Map的键值对个数</code>,而只能跟踪一个对象的键值对个数</li>
</ul>
<h2 id=".E6.B5.8F.E8.A7.88.E5.99.A8.E5.85.BC.E5.AE.B9.E6.80.A7">浏览器兼容性</h2>
<p>{{ CompatibilityTable() }}</p>
<div id="compat-desktop">
  <table class="compat-table">
    <tbody>
      <tr>
        <th>Feature</th>
        <th>Chrome</th>
        <th>Firefox (Gecko)</th>
        <th>Internet Explorer</th>
        <th>Opera</th>
        <th>Safari</th>
      </tr>
      <tr>
        <td>Basic support</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatGeckoDesktop("13") }}</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatNo() }}</td>
      </tr>
      <tr>
        <td>iterable</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatGeckoDesktop("17") }}</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatNo() }}</td>
      </tr>
      <tr>
        <td>Map.clear()</td>
        <td>{{ CompatNo() }}</td>
        <td>{{CompatGeckoDesktop("19")}}</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatNo() }}</td>
      </tr>
    </tbody>
  </table>
</div>
<div id="compat-mobile">
  <table class="compat-table">
    <tbody>
      <tr>
        <th>Feature</th>
        <th>Android</th>
        <th>Firefox Mobile (Gecko)</th>
        <th>IE Mobile</th>
        <th>Opera Mobile</th>
        <th>Safari Mobile</th>
      </tr>
      <tr>
        <td>Basic support</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatGeckoMobile("13") }}</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatNo() }}</td>
      </tr>
      <tr>
        <td>iterable</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatGeckoDesktop("17") }}</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatNo() }}</td>
      </tr>
      <tr>
        <td>Map.clear()</td>
        <td>{{ CompatNo() }}</td>
        <td>{{CompatGeckoMobile("19")}}</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatNo() }}</td>
        <td>{{ CompatNo() }}</td>
      </tr>
    </tbody>
  </table>
</div>
<h2 id=".E7.9B.B8.E5.85.B3.E9.93.BE.E6.8E.A5">相关链接</h2>
<ul>
  <li><a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=697479">Map and Set bug at Mozilla</a></li>
  <li><a class="external" href="http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets">ECMAScript Harmony proposal</a></li>
</ul>
Revert to this revision