Apply your JS skills to key Mozilla projects as an MDN Fellow! http://mzl.la/MDNFellowship

mozilla

Revision 639877 of Symbol.for()

  • Revision slug: Web/JavaScript/Reference/Global_Objects/Symbol/for
  • Revision title: Symbol.for()
  • Revision id: 639877
  • Created:
  • Creator: ziyunfei
  • Is current revision? Yes
  • Comment

Revision Content

{{JSRef("Global_Objects", "Symbol")}} {{harmony}}

概述

Symbol.for(key) 方法会根据给定的键 key,来从 symbol 注册表中找到对应的 symbol,如果找到了,则返回它,否则,新建一个与该键关联的 symbol,并放入 symbol 注册表中。

语法

Symbol.for(key);

参数

key
一个字符串,作为 symbol 注册表中与某 symbol 关联的键(同时也会作为该 symbol 的描述)。

描述

Symbol() 不同的是,用 Symbol.for() 方法创建的的 symbol 会被放入一个叫 symbol 注册表的记录表中,当第二次获取相同键的 symbol 时,Symbol.for() 会直接返回上次存储的那个,不会再新建一个。

symbol 注册表

symbol 注册表中的记录结构:

symbol 注册表中的一个记录
字段名 字段值
[[key]] 一个字符串,用来标识每个 symbol
[[symbol]] 存储的 symbol 值

示例

Symbol.for("foo"); // 创建一个 symbol 并放入 symbol 注册表中,键为 "foo"
Symbol.for("foo"); // 从 symbol 注册表中读取键为"foo"的 symbol


Symbol.for("bar") === Symbol.for("bar"); // true,证明了上面说的
Symbol("bar") === Symbol("bar"); // false,Symbol() 函数每次都会返回新的一个 symbol


var sym = Symbol.for("mario");
sym.toString(); 
// "Symbol(mario)",mario 既是该 symbol 在 symbol 注册表中的键名,又是该 symbol 自身的描述字符串

为了防止冲突,最好给你要放入 symbol 注册表中的 symbol 带上键前缀。

Symbol.for("mdn.foo");
Symbol.for("mdn.bar");

规范

Specification Status Comment
{{SpecName('ES6', '#sec-symbol.for', 'Symbol.for')}} {{Spec2('ES6')}} Initial definition.

浏览器兼容性

{{ CompatibilityTable() }}

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support {{ CompatNo() }} {{ CompatGeckoDesktop("33.0") }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }}
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support {{ CompatNo() }} {{ CompatNo() }} {{ CompatGeckoMobile("33.0") }} {{ CompatNo() }} {{ CompatNo() }} {{ CompatNo() }}

相关链接

  • {{jsxref("Symbol.prototype.keyFor()")}}

Revision Source

<div>
 {{JSRef("Global_Objects", "Symbol")}} {{harmony}}</div>
<h2 id="Summary" name="Summary">概述</h2>
<p><code><strong>Symbol.for(key)</strong></code> 方法会根据给定的键 <code>key</code>,来从 symbol 注册表中找到对应的 symbol,如果找到了,则返回它,否则,新建一个与该键关联的 symbol,并放入 symbol 注册表中。</p>
<h2 id="Syntax" name="Syntax">语法</h2>
<pre class="syntaxbox">
<var>Symbol.for(key)</var>;</pre>
<h3 id=".E5.8F.82.E6.95.B0">参数</h3>
<dl>
 <dt>
  key</dt>
 <dd>
  一个字符串,作为 symbol 注册表中与某 symbol 关联的键(同时也会作为该 symbol 的描述)。</dd>
</dl>
<h2 id="Description" name="Description">描述</h2>
<p>和 <code>Symbol()</code> 不同的是,用 <code>Symbol.for()</code> 方法创建的的 symbol 会被放入一个叫 <strong>symbol 注册表</strong>的记录表中,当第二次获取相同键的 symbol 时,<code>Symbol.for()</code> 会直接返回上次存储的那个,不会再新建一个。</p>
<h3 id="symbol_.E6.B3.A8.E5.86.8C.E8.A1.A8">symbol 注册表</h3>
<p>symbol 注册表中的记录结构:</p>
<table class="standard-table">
 <caption>
  symbol 注册表中的一个记录</caption>
 <tbody>
  <tr>
   <th>字段名</th>
   <th>字段值</th>
  </tr>
  <tr>
   <td>[[key]]</td>
   <td>一个字符串,用来标识每个 symbol</td>
  </tr>
  <tr>
   <td>[[symbol]]</td>
   <td>存储的 symbol 值</td>
  </tr>
 </tbody>
</table>
<h2 id=".E7.A4.BA.E4.BE.8B">示例</h2>
<pre class="brush: js">
Symbol.for("foo"); // 创建一个 symbol 并放入 symbol 注册表中,键为 "foo"
Symbol.for("foo"); // 从 symbol 注册表中读取键为"foo"的 symbol


Symbol.for("bar") === Symbol.for("bar"); // true,证明了上面说的
Symbol("bar") === Symbol("bar"); // false,Symbol() 函数每次都会返回新的一个 symbol


var sym = Symbol.for("mario");
sym.toString(); 
// "Symbol(mario)",mario 既是该 symbol 在 symbol 注册表中的键名,又是该 symbol 自身的描述字符串
</pre>
<p>为了防止冲突,最好给你要放入 symbol 注册表中的 symbol 带上键前缀。</p>
<pre class="brush: js">
Symbol.for("mdn.foo");
Symbol.for("mdn.bar");
</pre>
<h2 id=".E8.A7.84.E8.8C.83">规范</h2>
<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Specification</th>
   <th scope="col">Status</th>
   <th scope="col">Comment</th>
  </tr>
  <tr>
   <td>{{SpecName('ES6', '#sec-symbol.for', 'Symbol.for')}}</td>
   <td>{{Spec2('ES6')}}</td>
   <td>Initial definition.</td>
  </tr>
 </tbody>
</table>
<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("33.0") }}</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>Chrome for 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>{{ CompatNo() }}</td>
    <td>{{ CompatGeckoMobile("33.0") }}</td>
    <td>{{ CompatNo() }}</td>
    <td>{{ CompatNo() }}</td>
    <td>{{ CompatNo() }}</td>
   </tr>
  </tbody>
 </table>
</div>
<h2 id="See_Also" name="See_Also">相关链接</h2>
<ul>
 <li>{{jsxref("Symbol.prototype.keyFor()")}}</li>
</ul>
Revert to this revision