diff options
| author | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:40:17 -0500 |
|---|---|---|
| committer | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:40:17 -0500 |
| commit | 33058f2b292b3a581333bdfb21b8f671898c5060 (patch) | |
| tree | 51c3e392513ec574331b2d3f85c394445ea803c6 /files/zh-cn/web/javascript/reference/global_objects/symbol | |
| parent | 8b66d724f7caf0157093fb09cfec8fbd0c6ad50a (diff) | |
| download | translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.gz translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.bz2 translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.zip | |
initial commit
Diffstat (limited to 'files/zh-cn/web/javascript/reference/global_objects/symbol')
22 files changed, 2134 insertions, 0 deletions
diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/@@toprimitive/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/@@toprimitive/index.html new file mode 100644 index 0000000000..3a4624f560 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/@@toprimitive/index.html @@ -0,0 +1,55 @@ +--- +title: 'Symbol.prototype[@@toPrimitive]' +slug: Web/JavaScript/Reference/Global_Objects/Symbol/@@toPrimitive +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/@@toPrimitive +--- +<div>{{JSRef}}</div> + +<p><code><strong>[@@toPrimitive]()</strong></code> 方法可将 Symbol 对象转换为原始值。</p> + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox"><var>Symbol()[Symbol.toPrimitive](hint); +</var></pre> + +<h3 id="返回值">返回值</h3> + +<p>该原始值为指定的 {{jsxref("Symbol")}} 对象</p> + +<h2 id="描述">描述</h2> + +<p> {{jsxref("Symbol")}} 的 <code>[@@toPrimitive]()</code> 方法返回该 Symbol 对象原始值作为 Symbol 数据形式。 <code>hint</code> 参数未被使用。</p> + +<p>JavaScript 调用 <code>[@@toPrimitive]() </code>方法将一个对象转换为原始值表示。你不需要自己调用 <code>[@@toPrimitive]()</code> 方法;当对象需要被转换为原始值时,JavaScript 会自动地调用该方法。</p> + +<h2 id="规范">规范</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.prototype-@@toprimitive', 'Symbol.prototype.@@toPrimitive')}}</td> + <td>{{Spec2('ES6')}}</td> + <td>Initial definition.</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.prototype-@@toprimitive', 'Symbol.prototype.@@toPrimitive')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p>{{Compat("javascript.builtins.Symbol.@@toPrimitive")}}</p> + +<h2 id="参考资料">参考资料</h2> + +<ul> + <li>{{jsxref("Symbol.toPrimitive")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/asynciterator/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/asynciterator/index.html new file mode 100644 index 0000000000..f0c05da9ab --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/asynciterator/index.html @@ -0,0 +1,76 @@ +--- +title: Symbol.asyncIterator +slug: Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator +--- +<div>{{JSRef}}</div> + +<p><code><strong>Symbol.asyncIterator</strong></code> 符号指定了一个对象的默认异步迭代器。如果一个对象设置了这个属性,它就是异步可迭代对象,可用于<code><a href="/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of">for await...of</a></code>循环。</p> + + + +<h2 id="描述">描述</h2> + +<p><code>Symbol.asyncIterator</code> 是一个用于访问对象的<code>@@asyncIterator</code>方法的内建符号。一个异步可迭代对象必须要有<code>Symbol.asyncIterator</code>属性。</p> + +<p>{{js_property_attributes(0,0,0)}}</p> + +<h2 id="示例">示例</h2> + +<h3 id="自定义异步可迭代对象">自定义异步可迭代对象</h3> + +<p>你可以通过设置<code>[Symbol.asyncIterator]</code>属性来自定义异步可迭代对象。</p> + +<pre class="brush: js">const myAsyncIterable = new Object(); +myAsyncIterable[Symbol.asyncIterator] = async function*() { + yield "hello"; + yield "async"; + yield "iteration!"; +}; + +(async () => { + for await (const x of myAsyncIterable) { + console.log(x); + // expected output: + // "hello" + // "async" + // "iteration!" + } +})(); +</pre> + +<h3 id="内建异步可迭代对象">内建异步可迭代对象</h3> + +<p>目前没有默认设定了<code>[Symbol.asyncIterator]</code>属性的JavaScript内建的对象。不过,WHATWG(网页超文本应用技术工作小组)Streams会被设定为第一批异步可迭代对象,<code>[Symbol.asyncIterator]</code> 最近已在设计规范中落地。</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">标准</th> + <th scope="col">状态</th> + <th scope="col">注释</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{SpecName('ES2018', '#sec-symbol.asynciterator', 'Symbol.asyncIterator')}}</td> + <td>{{Spec2('ES2018')}}</td> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + + + +<p>{{compat("javascript.builtins.Symbol.asyncIterator")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/en-US/docs/Web/JavaScript/Reference/Iteration_protocols">Iteration protocols</a></li> + <li><a href="/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of">for await... of</a></li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/description/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/description/index.html new file mode 100644 index 0000000000..1e52358a63 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/description/index.html @@ -0,0 +1,73 @@ +--- +title: Symbol.prototype.description +slug: Web/JavaScript/Reference/Global_Objects/Symbol/description +tags: + - JavaScript + - Property + - Prototype + - Symbol +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/description +--- +<div>{{JSRef}}</div> + +<p><code><strong>description</strong></code> 是一个只读属性,它会返回 {{jsxref("Symbol")}} 对象的可选描述的字符串。</p> + +<div>{{EmbedInteractiveExample("pages/js/symbol-prototype-description.html")}}</div> + + + +<h2 id="语法">语法</h2> + +<pre class="syntaxbox">Symbol('myDescription').description; +Symbol.iterator.description; +Symbol.for('foo').description; +</pre> + +<h2 id="描述">描述</h2> + +<p>{{jsxref("Symbol")}} 对象可以通过一个可选的描述创建,可用于调试,但不能用于访问 symbol 本身。<code>Symbol.prototype.description</code> 属性可以用于读取该描述。与 <code>Symbol.prototype.toString()</code> 不同的是它不会包含 "<code>Symbol()</code>" 的字符串。具体请看实例。</p> + +<h2 id="实例">实例</h2> + +<pre class="brush: js">Symbol('desc').toString(); // "Symbol(desc)" +Symbol('desc').description; // "desc" +Symbol('').description; // "" +Symbol().description; // undefined + +// well-known symbols +Symbol.iterator.toString(); // "Symbol(Symbol.iterator)" +Symbol.iterator.description; // "Symbol.iterator" + +// global symbols +Symbol.for('foo').toString(); // "Symbol(foo)" +Symbol.for('foo').description; // "foo" + +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + </tr> + <tr> + <td><code><a href="https://tc39.github.io/proposal-Symbol-description/#sec-symbol.prototype.description">get Symbol.prototype.description</a></code> proposal</td> + <td>Stage 3</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容">浏览器兼容</h2> + + + +<p>{{Compat("javascript.builtins.Symbol.description")}}</p> + +<h2 id="另请参阅">另请参阅</h2> + +<ul> + <li>{{jsxref("Symbol.prototype.toString()")}}</li> + <li>Polyfill: <a href="https://npmjs.com/symbol.prototype.description">https://npmjs.com/symbol.prototype.description</a></li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/for/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/for/index.html new file mode 100644 index 0000000000..ee0b84406a --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/for/index.html @@ -0,0 +1,154 @@ +--- +title: Symbol.for() +slug: Web/JavaScript/Reference/Global_Objects/Symbol/for +tags: + - JavaScript + - Method + - Symbol +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/for +--- +<div>{{JSRef}} </div> + +<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="参数">参数</h3> + +<dl> + <dt>key</dt> + <dd>一个字符串,作为 symbol 注册表中与某 symbol 关联的键(同时也会作为该 symbol 的描述)。</dd> +</dl> + +<h3 id="返回值">返回值</h3> + +<p>返回由给定的 key 找到的 symbol,否则就是返回新创建的 symbol。</p> + +<h2 id="Description" name="Description">描述</h2> + +<p>和 <code>Symbol()</code> 不同的是,用 <code>Symbol.for()</code> 方法创建的的 symbol 会被放入一个全局 symbol 注册表中。<code>Symbol.for() 并不是每次都会创建一个新的 symbol</code>,它会首先检查给定的 key 是否已经在注册表中了。假如是,则会直接返回上次存储的那个。否则,它会再新建一个。</p> + +<h3 id="全局_symbol_注册表">全局 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="示例">示例</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="规范">规范</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('ES2015', '#sec-symbol.for', 'Symbol.for')}}</td> + <td>{{Spec2('ES2015')}}</td> + <td>Initial definition.</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.for', 'Symbol.for')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</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>{{ CompatChrome(40) }}</td> + <td>{{ CompatGeckoDesktop("36.0") }}</td> + <td>{{ CompatNo() }}</td> + <td>{{ CompatNo() }}</td> + <td>10</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("36.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.keyFor()")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/hasinstance/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/hasinstance/index.html new file mode 100644 index 0000000000..ad28084f8e --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/hasinstance/index.html @@ -0,0 +1,59 @@ +--- +title: Symbol.hasInstance +slug: Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/hasInstance +--- +<p>{{JSRef}}</p> + +<p><strong><code>Symbol.hasInstance</code></strong>用于判断某对象是否为某构造器的实例。因此你可以用它自定义 {{jsxref("Operators/instanceof", "instanceof")}} 操作符在某个类上的行为。</p> + +<div> +<div>{{EmbedInteractiveExample("pages/js/symbol-hasinstance.html")}}</div> + +<div class="hidden">The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> and send us a pull request.</div> +</div> + +<div>{{js_property_attributes(0,0,0)}}</div> + +<h2 id="示例">示例</h2> + +<p><font face="Open Sans, Arial, sans-serif">你可实现一个自定义的</font><code>instanceof</code> 行为,<font face="Open Sans, Arial, sans-serif">例如:</font></p> + +<pre class="brush: js notranslate">class MyArray { + static [Symbol.hasInstance](instance) { + return Array.isArray(instance); + } +} +console.log([] instanceof MyArray); // true</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">文档</th> + <th scope="col">状态</th> + <th scope="col">备注</th> + </tr> + <tr> + <td>{{SpecName('ES6', '#sec-symbol.hasinstance', 'Symbol.hasInstance')}}</td> + <td>{{Spec2('ES6')}}</td> + <td>Initial definition.</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.hasinstance', 'Symbol.hasInstance')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p>{{Compat("javascript.builtins.Symbol.hasInstance")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{jsxref("Operators/instanceof", "instanceof")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/index.html new file mode 100644 index 0000000000..9aec2c8777 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/index.html @@ -0,0 +1,227 @@ +--- +title: Symbol +slug: Web/JavaScript/Reference/Global_Objects/Symbol +tags: + - ECMAScript6 + - JavaScript + - Symbol +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol +--- +<div>{{JSRef}} </div> + +<p><strong>symbol</strong> 是一种基本数据类型 ({{Glossary("Primitive", "primitive data type")}})。<code>Symbol()</code>函数会返回<strong>symbol</strong>类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:"<code>new Symbol()</code>"。</p> + +<p>每个从<code>Symbol()</code>返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。更进一步的解析见—— <a href="https://developer.mozilla.org/en-US/docs/Glossary/Symbol">glossary entry for Symbol</a>。</p> + +<div>{{EmbedInteractiveExample("pages/js/symbol-constructor.html")}}</div> + + + +<h2 id="Syntax" name="Syntax">语法</h2> + +<pre class="syntaxbox notranslate"><code>Symbol(<em>[description]</em>)</code></pre> + +<h3 id="Parameters" name="Parameters">参数</h3> + +<dl> + <dt><code>description</code> {{optional_inline}}</dt> + <dd>可选的,字符串类型。对symbol的描述,可用于调试但不是访问symbol本身。</dd> +</dl> + +<h2 id="Description" name="Description">描述</h2> + +<p>直接使用<code>Symbol()</code>创建新的symbol类型,并用一个可选的字符串作为其描述。</p> + +<pre class="brush: js notranslate">var sym1 = Symbol(); +var sym2 = Symbol('foo'); +var sym3 = Symbol('foo'); +</pre> + +<p>上面的代码创建了三个新的symbol类型。 注意,<code>Symbol("foo")</code> 不会强制将字符串 “foo” 转换成symbol类型。它每次都会创建一个新的 symbol类型:</p> + +<pre class="brush: js notranslate">Symbol("foo") === Symbol("foo"); // false</pre> + +<p>下面带有 {{jsxref("Operators/new", "new")}} 运算符的语法将抛出 {{jsxref("TypeError")}} 错误:</p> + +<pre class="brush: js notranslate">var sym = new Symbol(); // TypeError</pre> + +<p>这会阻止创建一个显式的 Symbol 包装器对象而不是一个 Symbol 值。围绕原始数据类型创建一个显式包装器对象从 ECMAScript 6 开始不再被支持。 然而,现有的原始包装器对象,如 <code style="font-style: normal;">new Boolean</code>、<code style="font-style: normal;">new String</code>以及<span style="font-family: consolas,monaco,andale mono,monospace;"><code>new Number</code>,因为遗留原因仍可被创建。</span></p> + +<p>如果你真的想创建一个 <u>Symbol 包装器对象 </u>(<code>Symbol wrapper object</code>),你可以使用 <code>Object()</code> 函数:</p> + +<pre class="brush: js notranslate">var sym = Symbol("foo"); +typeof sym; // "symbol" +var symObj = Object(sym); +typeof symObj; // "object"</pre> + +<h3 id="全局共享的_Symbol">全局共享的 Symbol</h3> + +<p>上面使用<code>Symbol()</code> 函数的语法,不会在你的整个代码库中创建一个可用的全局的symbol类型。 要创建跨文件可用的symbol,甚至跨域(每个都有它自己的全局作用域) , 使用 {{jsxref("Symbol.for()")}} 方法和 {{jsxref("Symbol.keyFor()")}} 方法从全局的symbol注册表设置和取得symbol。</p> + +<h3 id="在对象中查找_Symbol_属性">在对象中查找 Symbol 属性</h3> + +<p>{{jsxref("Object.getOwnPropertySymbols()")}} 方法让你在查找一个给定对象的符号属性时返回一个symbol类型的数组。注意,每个初始化的对象都是没有自己的symbol属性的,因此这个数组可能为空,除非你已经在对象上设置了symbol属性。</p> + +<h2 id="Properties" name="Properties">属性</h2> + +<dl> + <dt><code>Symbol.length</code></dt> + <dd>长度属性,值为0。</dd> + <dt>{{jsxref("Symbol.prototype")}}</dt> + <dd><code>symbol</code>构造函数的原型。</dd> +</dl> + +<h3 id="众所周知的_symbols">众所周知的 symbols</h3> + +<p>除了自己创建的symbol,JavaScript还内建了一些在ECMAScript 5 之前没有暴露给开发者的symbol,它们代表了内部语言行为。它们可以使用以下属性访问:</p> + +<dl> + <dt> + <h4 id="迭代_symbols">迭代 symbols</h4> + </dt> + <dt>{{jsxref("Symbol.iterator")}}</dt> + <dd>一个返回一个对象默认迭代器的方法。被 <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of">for...of</a></code> 使用。</dd> + <dt>{{jsxref("Symbol.asyncIterator")}} {{experimental_inline}}</dt> + <dd>一个返回对象默认的异步迭代器的方法。被 <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of">for await of</a></code> 使用。</dd> + <dt> + <h4 id="正则表达式_symbols">正则表达式 symbols</h4> + </dt> + <dt>{{jsxref("Symbol.match")}}</dt> + <dd>一个用于对字符串进行匹配的方法,也用于确定一个对象是否可以作为正则表达式使用。被 {{jsxref("String.prototype.match()")}} 使用。</dd> + <dt>{{jsxref("Symbol.replace")}}</dt> + <dd>一个替换匹配字符串的子串的方法. 被 {{jsxref("String.prototype.replace()")}} 使用。</dd> + <dt>{{jsxref("Symbol.search")}}</dt> + <dd>一个返回一个字符串中与正则表达式相匹配的索引的方法。被{{jsxref("String.prototype.search()")}} 使用。</dd> + <dt>{{jsxref("Symbol.split")}}</dt> + <dd>一个在匹配正则表达式的索引处拆分一个字符串的方法.。被 {{jsxref("String.prototype.split()")}} 使用。</dd> + <dt> + <h4 id="其他_symbols">其他 symbols</h4> + </dt> + <dt>{{jsxref("Symbol.hasInstance")}}</dt> + <dd>一个确定一个构造器对象识别的对象是否为它的实例的方法。被 {{jsxref("Operators/instanceof", "instanceof")}} 使用。</dd> + <dt>{{jsxref("Symbol.isConcatSpreadable")}}</dt> + <dd>一个布尔值,表明一个对象是否应该flattened为它的数组元素。被 {{jsxref("Array.prototype.concat()")}} 使用。</dd> + <dt>{{jsxref("Symbol.unscopables")}}</dt> + <dd>拥有和继承属性名的一个对象的值被排除在与环境绑定的相关对象外。</dd> + <dt>{{jsxref("Symbol.species")}}</dt> + <dd>一个用于创建派生对象的构造器函数。</dd> + <dt>{{jsxref("Symbol.toPrimitive")}}</dt> + <dd>一个将对象转化为基本数据类型的方法。</dd> + <dt>{{jsxref("Symbol.toStringTag")}}</dt> + <dd>用于对象的默认描述的字符串值。被 {{jsxref("Object.prototype.toString()")}} 使用。</dd> +</dl> + +<h2 id="Methods" name="Methods">方法</h2> + +<dl> + <dt>{{jsxref("Symbol.for()", "Symbol.for(key)")}}</dt> + <dd>使用给定的key搜索现有的symbol,如果找到则返回该symbol。否则将使用给定的key在全局symbol注册表中创建一个新的symbol。</dd> + <dt>{{jsxref("Symbol.keyFor", "Symbol.keyFor(sym)")}}</dt> + <dd>从全局symbol注册表中,为给定的symbol检索一个共享的?symbol key。</dd> +</dl> + +<h2 id="Boolean_instances" name="Boolean_instances"><font face="Consolas, Monaco, Andale Mono, monospace">Symbol 原型</font></h2> + +<p>所有 Symbols 继承自 {{jsxref("Symbol.prototype")}}.</p> + +<h3 id="属性">属性</h3> + +<p>{{page('zh-CN/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Properties')}}</p> + +<h3 id="方法">方法</h3> + +<p>{{page('zh-CN/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Methods')}}</p> + +<h2 id="Examples" name="Examples">示例</h2> + +<h3 id="Creating_Boolean_objects_with_an_initial_value_of_false" name="Creating_Boolean_objects_with_an_initial_value_of_false">对 symbol 使用 typeof 运算符</h3> + +<p> {{jsxref("Operators/typeof", "typeof")}}运算符能帮助你识别 symbol 类型</p> + +<pre class="brush: js notranslate"><code class="language-js"><span class="keyword token">typeof</span> <span class="function token">Symbol<span class="punctuation token">(</span></span><span class="punctuation token">)</span> <span class="operator token">==</span><span class="operator token">=</span> <span class="string token">'symbol'</span> +<span class="keyword token">typeof</span> <span class="function token">Symbol<span class="punctuation token">(</span></span><span class="string token">'foo'</span><span class="punctuation token">)</span> <span class="operator token">==</span><span class="operator token">=</span> <span class="string token">'symbol'</span> +<span class="keyword token">typeof</span> Symbol<span class="punctuation token">.</span>iterator <span class="operator token">==</span><span class="operator token">=</span> <span class="string token">'symbol'</span></code> +</pre> + +<h3 id="Symbol_类型转换">Symbol 类型转换</h3> + +<p>当使用 symbol 值进行类型转换时需要注意一些事情:</p> + +<ul> + <li>尝试将一个 symbol 值转换为一个 number 值时,会抛出一个 {{jsxref("TypeError")}} 错误 (e.g. <code>+sym</code> or <code>sym | 0</code>).</li> + <li>使用宽松相等时, <code>Object(sym) == sym</code> returns <code>true.</code></li> + <li>这会阻止你从一个 symbol 值隐式地创建一个新的 string 类型的属性名。例如,<code>Symbol("foo") + "bar" 将抛出一个</code> {{jsxref("TypeError")}} (can't convert symbol to string).</li> + <li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#String_conversion">"safer" <code>String(sym)</code> conversion</a> 的作用会像symbol类型调用 {{jsxref("Symbol.prototype.toString()")}} 一样,但是注意 <code>new String(sym)</code> 将抛出异常。</li> +</ul> + +<h3 id="Symbols_与_for...in_迭代">Symbols 与 <code>for...in</code> 迭代</h3> + +<p>Symbols 在 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in"><code>for...in</code></a> 迭代中不可枚举。另外,{{jsxref("Object.getOwnPropertyNames()")}} 不会返回 symbol 对象的属性,但是你能使用 {{jsxref("Object.getOwnPropertySymbols()")}} 得到它们。</p> + +<pre class="brush: js line-numbers language-js notranslate"><code class="language-js"><span class="keyword token">var</span> obj <span class="operator token">=</span> <span class="punctuation token">{</span><span class="punctuation token">}</span><span class="punctuation token">;</span> + +obj<span class="punctuation token">[</span><span class="function token">Symbol</span><span class="punctuation token">(</span><span class="string token">"a"</span><span class="punctuation token">)</span><span class="punctuation token">]</span> <span class="operator token">=</span> <span class="string token">"a"</span><span class="punctuation token">;</span> +obj<span class="punctuation token">[</span>Symbol<span class="punctuation token">.</span><span class="keyword token">for</span><span class="punctuation token">(</span><span class="string token">"b"</span><span class="punctuation token">)</span><span class="punctuation token">]</span> <span class="operator token">=</span> <span class="string token">"b"</span><span class="punctuation token">;</span> +obj<span class="punctuation token">[</span><span class="string token">"c"</span><span class="punctuation token">]</span> <span class="operator token">=</span> <span class="string token">"c"</span><span class="punctuation token">;</span> +obj<span class="punctuation token">.</span>d <span class="operator token">=</span> <span class="string token">"d"</span><span class="punctuation token">;</span> + +<span class="keyword token">for</span> <span class="punctuation token">(</span><span class="keyword token">var</span> i <span class="keyword token">in</span> obj<span class="punctuation token">)</span> <span class="punctuation token">{</span> + console<span class="punctuation token">.</span><span class="function token">log</span><span class="punctuation token">(</span>i<span class="punctuation token">)</span><span class="punctuation token">;</span> <span class="comment token">// logs "c" and "d"</span> +<span class="punctuation token">}</span></code></pre> + +<h3 id="Symbols_与_JSON.stringify">Symbols 与 <code>JSON.stringify()</code></h3> + +<p>当使用 JSON.stringify() 时,以 symbol 值作为键的属性会被完全忽略:</p> + +<pre class="brush: js notranslate"><code class="language-js">JSON<span class="punctuation token">.</span><span class="function token">stringify</span><span class="punctuation token">(</span><span class="punctuation token">{</span><span class="punctuation token">[</span><span class="function token">Symbol</span><span class="punctuation token">(</span><span class="string token">"foo"</span><span class="punctuation token">)</span><span class="punctuation token">]</span><span class="punctuation token">:</span> <span class="string token">"foo"</span><span class="punctuation token">}</span><span class="punctuation token">)</span><span class="punctuation token">;</span> +<span class="comment token">// '{}'</span></code></pre> + +<p>更多细节,请看 {{jsxref("JSON.stringify()")}}。</p> + +<h3 id="Symbol_包装器对象作为属性的键">Symbol 包装器对象作为属性的键</h3> + +<p>当一个 Symbol 包装器对象作为一个属性的键时,这个对象将被强制转换为它包装过的 symbol 值:</p> + +<pre class="brush: js notranslate"><code class="language-js"><span class="keyword token">var</span> sym <span class="operator token">=</span> <span class="function token">Symbol</span><span class="punctuation token">(</span><span class="string token">"foo"</span><span class="punctuation token">)</span><span class="punctuation token">;</span> +<span class="keyword token">var</span> obj <span class="operator token">=</span> <span class="punctuation token">{</span><span class="punctuation token">[</span>sym<span class="punctuation token">]</span><span class="punctuation token">:</span> <span class="number token">1</span><span class="punctuation token">}</span><span class="punctuation token">;</span> +obj<span class="punctuation token">[</span>sym<span class="punctuation token">]</span><span class="punctuation token">;</span> <span class="comment token">// 1</span> +obj<span class="punctuation token">[</span><span class="function token">Object</span><span class="punctuation token">(</span>sym<span class="punctuation token">)</span><span class="punctuation token">]</span><span class="punctuation token">;</span> <span class="comment token">// still 1</span></code></pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table" style="height: 143px; width: 640px;"> + <tbody> + <tr> + <th scope="col">标准</th> + <th scope="col">状态</th> + <th scope="col">注释</th> + </tr> + <tr> + <td>{{SpecName('ES6', '#sec-symbol-objects', 'Symbol')}}</td> + <td>{{Spec2('ES6')}}</td> + <td>原始定义</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol-objects', 'Symbol')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + + + +<p>{{Compat("javascript.builtins.Symbol")}}</p> + +<h2 id="参考文档">参考文档</h2> + +<ul> + <li><a href="/en-US/docs/Glossary/Symbol">Glossary: Symbol data type</a></li> + <li>{{jsxref("Operators/typeof", "typeof")}}</li> + <li><a href="/en-US/docs/Web/JavaScript/Data_structures">Data types and data structures</a></li> + <li><a href="https://hacks.mozilla.org/2015/06/es6-in-depth-symbols/">"ES6 In Depth: Symbols"(深入ES6 Symbols ) on hacks.mozilla.org</a></li> +</ul> + +<div class="itanywhere-activator" style="left: 41px; top: 3679px; display: none;" title="Google Translator Anywhere"></div> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/isconcatspreadable/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/isconcatspreadable/index.html new file mode 100644 index 0000000000..ed98d2bb29 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/isconcatspreadable/index.html @@ -0,0 +1,97 @@ +--- +title: Symbol.isConcatSpreadable +slug: Web/JavaScript/Reference/Global_Objects/Symbol/isConcatSpreadable +tags: + - JavaScript + - Symbol +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/isConcatSpreadable +--- +<div>{{JSRef}}</div> + +<p>内置的<strong><code>Symbol.isConcatSpreadable</code></strong><code>符号用于配置某对象作为</code>{{jsxref("Array.prototype.concat()")}}方法的参数时是否展开其数组元素。</p> + +<div>{{EmbedInteractiveExample("pages/js/symbol-isconcatspreadable.html")}}</div> + +<h2 id="描述">描述</h2> + +<p><code>@@isConcatSpreadable</code> 符号 (<code>Symbol.isConcatSpreadable</code>) 可以直接定义为对象属性或继承而来,它是布尔类型。它可以控制数组或类似数组(array-like)的对象的行为:</p> + +<ul> + <li>对于数组对象,默认情况下,用于concat时,会按数组元素展开然后进行连接(数组元素作为新数组的元素)。重置<code>Symbol.isConcatSpreadable</code>可以改变默认行为。</li> + <li>对于类似数组的对象,用于concat时,该对象整体作为新数组的元素,重置<code>Symbol.isConcatSpreadable</code>可改变默认行为。</li> +</ul> + +<p>{{js_property_attributes(0,0,0)}}</p> + +<h2 id="示例">示例</h2> + +<h3 id="数组">数组</h3> + +<p>默认情况下,{{jsxref("Array.prototype.concat()")}} 展开其元素连接到结果中:</p> + +<pre class="brush: js">var alpha = ['a', 'b', 'c'], + numeric = [1, 2, 3]; + +var alphaNumeric = alpha.concat(numeric); + +console.log(alphaNumeric); // 结果: ['a', 'b', 'c', 1, 2, 3] +</pre> + +<p>设置<code>Symbol.isConcatSpreadable</code>为<code>false</code>:</p> + +<pre class="brush: js">var alpha = ['a', 'b', 'c'], + numeric = [1, 2, 3]; + +numeric[Symbol.isConcatSpreadable] = false; +var alphaNumeric = alpha.concat(numeric); + +console.log(alphaNumeric); // 结果: ['a', 'b', 'c', [1, 2, 3] ] +</pre> + +<h3 id="Array-like_对象">Array-like 对象</h3> + +<p>对于类数组 (array-like)对象,默认不展开。期望展开其元素用于连接,需要设置 <code>Symbol.isConcatSpreadable</code> 为true:</p> + +<pre class="brush: js">var x = [1, 2, 3]; + +var fakeArray = { + [Symbol.isConcatSpreadable]: true, + length: 2, + 0: "hello", + 1: "world" +} + +x.concat(fakeArray); // [1, 2, 3, "hello", "world"] +</pre> + +<h2 id="技术标准">技术标准</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">标准</th> + <th scope="col">状态</th> + <th scope="col">备注</th> + </tr> + <tr> + <td>{{SpecName('ES6', '#sec-symbol.isconcatspreadable', 'Symbol.isconcatspreadable')}}</td> + <td>{{Spec2('ES6')}}</td> + <td>Initial definition.</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.isconcatspreadable', 'Symbol.isconcatspreadable')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td>No change.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p>{{Compat("javascript.builtins.Symbol.isConcatSpreadable")}}</p> + +<h2 id="参考">参考</h2> + +<ul> + <li>{{jsxref("Array.prototype.concat()")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/iterator/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/iterator/index.html new file mode 100644 index 0000000000..558a1323ca --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/iterator/index.html @@ -0,0 +1,94 @@ +--- +title: Symbol.iterator +slug: Web/JavaScript/Reference/Global_Objects/Symbol/iterator +tags: + - ECMAScript 2015 + - JavaScript + - Property + - Symbol +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/iterator +--- +<div>{{JSRef}}</div> + +<p><strong>Symbol.iterator </strong>为每一个对象定义了默认的迭代器。该迭代器可以被 <code><a href="/zh-CN/docs/Web/JavaScript/Reference/Statements/for...of">for...of</a></code> 循环使用。</p> + +<div>{{js_property_attributes(0,0,0)}}</div> + +<h2 id="描述">描述</h2> + +<p>当需要对一个对象进行迭代时(<font><font>比如开始用于一个</font></font><code><font><font>for..of</font></font></code><font><font>循环中</font></font>),它的<code>@@iterator</code>方法都会在不传参情况下被调用,返回的<strong>迭代器</strong>用于获取要迭代的值。</p> + +<p>一些内置类型拥有默认的迭代器行为,其他类型(如 {{jsxref("Object")}})则没有。下表中的内置类型拥有默认的<span style="font-family: consolas,monaco,andale mono,monospace;"><code>@@iterator</code></span>方法:</p> + +<ul> + <li>{{jsxref("Array.@@iterator", "Array.prototype[@@iterator]()")}}</li> + <li>{{jsxref("TypedArray.@@iterator", "TypedArray.prototype[@@iterator]()")}}</li> + <li>{{jsxref("String.@@iterator", "String.prototype[@@iterator]()")}}</li> + <li>{{jsxref("Map.@@iterator", "Map.prototype[@@iterator]()")}}</li> + <li>{{jsxref("Set.@@iterator", "Set.prototype[@@iterator]()")}}</li> +</ul> + +<p>更多信息请参见<a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols">迭代协议</a>。</p> + +<h2 id="示例">示例</h2> + +<h3 id="自定义迭代器">自定义迭代器</h3> + +<p>我们可以像下面这样创建自定义的迭代器:</p> + +<pre class="brush: js">var myIterable = {} +myIterable[Symbol.iterator] = function* () { + yield 1; + yield 2; + yield 3; +}; +[...myIterable] // [1, 2, 3] +</pre> + +<h3 id="不符合标准的迭代器">不符合标准的迭代器</h3> + +<p>如果一个迭代器 <code>@@iterator</code> 没有返回一个迭代器对象,那么它就是一个不符合标准的迭代器,这样的迭代器将会在运行期抛出异常,甚至非常诡异的 Bug。</p> + +<pre class="brush: js">var nonWellFormedIterable = {} +nonWellFormedIterable[Symbol.iterator] = () => 1 +[...nonWellFormedIterable] // TypeError: [] is not a function +</pre> + +<h2 id="规范">规范</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('ES2015', '#sec-symbol.iterator', 'Symbol.iterator')}}</td> + <td>{{Spec2('ES2015')}}</td> + <td>Initial definition.</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.iterator', 'Symbol.iterator')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<div class="hidden">The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</div> + +<p>{{Compat("javascript.builtins.Symbol.iterator")}}</p> + +<h2 id="相关链接">相关链接</h2> + +<ul> + <li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols">迭代协议</a></li> + <li>{{jsxref("Array.@@iterator", "Array.prototype[@@iterator]()")}}</li> + <li>{{jsxref("TypedArray.@@iterator", "TypedArray.prototype[@@iterator]()")}}</li> + <li>{{jsxref("String.@@iterator", "String.prototype[@@iterator]()")}}</li> + <li>{{jsxref("Map.@@iterator", "Map.prototype[@@iterator]()")}}</li> + <li>{{jsxref("Set.@@iterator", "Set.prototype[@@iterator]()")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/keyfor/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/keyfor/index.html new file mode 100644 index 0000000000..150ae66f02 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/keyfor/index.html @@ -0,0 +1,115 @@ +--- +title: Symbol.keyFor() +slug: Web/JavaScript/Reference/Global_Objects/Symbol/keyFor +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/keyFor +--- +<div>{{JSRef("Global_Objects", "Symbol")}}</div> + +<h2 id="Summary" name="Summary">概述</h2> + +<p><code><strong>Symbol.keyFor(sym)</strong></code> 方法用来获取全局symbol 注册表中与某个 symbol 关联的键。</p> + +<h2 id="Syntax" name="Syntax">语法</h2> + +<pre class="syntaxbox notranslate"><var>Symbol.keyFor(sym)</var>;</pre> + +<h3 id="参数">参数</h3> + +<dl> + <dt>sym</dt> + <dd>必选参数,需要查找键值的某个 Symbol 。</dd> +</dl> + +<h3 id="返回值">返回值</h3> + +<dl> + <dd>如果全局注册表中查找到该symbol,则返回该symbol的key值,返回值为字符串类型。否则返回undefined</dd> +</dl> + +<h2 id="示例">示例</h2> + +<pre class="brush: js notranslate">// 创建一个全局 Symbol +var globalSym = Symbol.for("foo"); +Symbol.keyFor(globalSym); // "foo" + +var localSym = Symbol(); +Symbol.keyFor(localSym); // undefined, + +// 以下Symbol不是保存在全局Symbol注册表中 +Symbol.keyFor(Symbol.iterator) // undefined +</pre> + +<h2 id="规范">规范</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.keyfor', 'Symbol.keyFor')}}</td> + <td>{{Spec2('ES6')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</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.for()")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/match/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/match/index.html new file mode 100644 index 0000000000..793b0ea01c --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/match/index.html @@ -0,0 +1,78 @@ +--- +title: Symbol.match +slug: Web/JavaScript/Reference/Global_Objects/Symbol/match +tags: + - JavaScript + - Symbol + - 属性 +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/match +--- +<div>{{JSRef}}</div> + +<p><code><strong>Symbol.match </strong></code>指定了匹配的是正则表达式而不是字符串。{{jsxref("String.prototype.match()")}} 方法会调用此函数。</p> + +<div>{{EmbedInteractiveExample("pages/js/symbol-match.html")}}</div> + + + +<h2 id="描述">描述</h2> + +<p>此函数还用于标识对象是否具有正则表达式的行为。比如, {{jsxref("String.prototype.startsWith()")}},{{jsxref("String.prototype.endsWith()")}} 和 {{jsxref("String.prototype.includes()")}} 这些方法会检查其第一个参数是否是正则表达式,是正则表达式就抛出一个{{jsxref("TypeError")}}。现在,如果 <code>match</code> symbol 设置为 <code>false</code>(或者一个 {{Glossary("Falsy", "假值")}}),就表示该对象不打算用作正则表达式对象。</p> + +<p>{{js_property_attributes(0,0,0)}}</p> + +<h2 id="示例">示例</h2> + +<h3 id="禁止表达式检查">禁止表达式检查</h3> + +<p>下面代码会抛出一个 {{jsxref("TypeError")}}:</p> + +<pre class="brush: js">"/bar/".startsWith(/bar/); + +// Throws TypeError, 因为 /bar/ 是一个正则表达式 +// 且 Symbol.match 没有修改。</pre> + +<p>但是,如果你将 <code>Symbol.match</code> 置为 <code>false</code>,使用 <code>match</code> 属性的表达式检查会认为该象不是正则表达式对象。<code>startsWith</code> 和 <code>endsWith</code> 方法将不会抛出 <code>TypeError</code>。</p> + +<pre class="brush: js">var re = /foo/; +re[Symbol.match] = false; +"/foo/".startsWith(re); // true +"/baz/".endsWith(re); // false +</pre> + +<h2 id="规范">规范</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('ES2015', '#sec-symbol.match', 'Symbol.match')}}</td> + <td>{{Spec2('ES2015')}}</td> + <td>Initial definition.</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.match', 'Symbol.match')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="浏览器支持">浏览器支持</h2> + + + +<p>{{Compat("javascript.builtins.Symbol.match")}}</p> + +<h2 id="相关链接">相关链接</h2> + +<ul> + <li>{{jsxref("Symbol.replace")}}</li> + <li>{{jsxref("Symbol.search")}}</li> + <li>{{jsxref("Symbol.split")}}</li> + <li>{{jsxref("RegExp.@@match", "RegExp.prototype[@@match]()")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/matchall/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/matchall/index.html new file mode 100644 index 0000000000..730107b31c --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/matchall/index.html @@ -0,0 +1,65 @@ +--- +title: Symbol.matchAll +slug: Web/JavaScript/Reference/Global_Objects/Symbol/matchAll +tags: + - JavaScript + - Property + - Reference + - Symbol +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/matchAll +--- +<div>{{JSRef}}</div> + +<p><code><strong>Symbol.matchAll</strong></code> 返回一个迭代器,该迭代器根据字符串生成正则表达式的匹配项。此函数可以被 {{jsxref("String.prototype.matchAll()")}} 方法调用。</p> + +<div>{{EmbedInteractiveExample("pages/js/symbol-matchall.html")}}</div> + + + +<h2 id="描述">描述</h2> + +<div> +<p>此Symbol用于 {{jsxref("String.prototype.matchAll()")}} 特别是 {{jsxref("RegExp.@@matchAll", "RegExp.prototype[@@matchAll]()")}}。下面两个例子返回相同的结果:</p> + +<pre class="brush: js">'abc'.matchAll(/a/); + +/a/[Symbol.matchAll]('abc');</pre> + +<p>此方法用于自定义 {{jsxref("RegExp")}} 子类中的匹配行为。</p> + +<p>{{js_property_attributes(0,0,0)}}</p> +</div> + +<h2 id="示例">示例</h2> + +<p>更多示例请查阅 {{jsxref("String.prototype.matchAll()")}} 和 {{jsxref("RegExp.@@matchAll", "RegExp.prototype[@@matchAll]()")}}。</p> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">文档</th> + <th scope="col">状态</th> + <th scope="col">备注</th> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.matchall', 'Symbol.matchAll')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="浏览器支持">浏览器支持</h2> + + + +<p>{{Compat("javascript.builtins.Symbol.matchAll")}}</p> + +<h2 id="相关链接">相关链接</h2> + +<ul> + <li>{{jsxref("String.prototype.matchAll()")}}</li> + <li>{{jsxref("RegExp.@@matchAll", "RegExp.prototype[@@matchAll]()")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/prototype/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/prototype/index.html new file mode 100644 index 0000000000..4ba14f92c5 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/prototype/index.html @@ -0,0 +1,66 @@ +--- +title: Symbol.prototype +slug: Web/JavaScript/Reference/Global_Objects/Symbol/prototype +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol +--- +<div>{{JSRef}}</div> + +<p><code><strong>Symbol</strong></code><strong><code>.prototype</code></strong> 表示 {{jsxref("Symbol")}} 构造函数的原型。.</p> + +<div>{{EmbedInteractiveExample("pages/js/symbol-prototype.html")}}</div> + +<h2 id="Description">Description</h2> + +<p>{{jsxref("Symbol")}} 继承自 {{jsxref("Symbol.prototype")}}. 你可以使用构造函数的原型对象来给所有Symbol实例添加属性或者方法。</p> + +<p>{{js_property_attributes(0,0,0)}}</p> + +<h2 id="Properties">Properties</h2> + +<dl> + <dt><code>Symbol.prototype.constructor</code></dt> + <dd>返回创建实例原型的函数. 默认为 {{jsxref("Symbol")}} 函数。</dd> + <dt>{{jsxref("Symbol.prototype.description")}}</dt> + <dd>一个包含symbol描述的只读字符串。</dd> +</dl> + +<h2 id="Methods">Methods</h2> + +<dl> + <dt>{{jsxref("Symbol.prototype.toSource()")}} {{Non-standard_inline}}</dt> + <dd>返回包含{{jsxref("Global_Objects/Symbol", "Symbol")}} 对象源码的字符串。覆盖{{jsxref("Object.prototype.toSource()")}} 方法。</dd> + <dt>{{jsxref("Symbol.prototype.toString()")}}</dt> + <dd>返回包含Symbol描述符的字符串。 覆盖{{jsxref("Object.prototype.toString()")}} 方法。</dd> + <dt>{{jsxref("Symbol.prototype.valueOf()")}}</dt> + <dd>返回 {{jsxref("Symbol")}} 对象的初始值.。覆盖 {{jsxref("Object.prototype.valueOf()")}} 方法。</dd> + <dt>{{jsxref("Symbol.prototype.@@toPrimitive()", "Symbol.prototype[@@toPrimitive]")}}</dt> + <dd> 返回{{jsxref("Symbol")}}对象的初始值。</dd> +</dl> + +<h2 id="Specifications">Specifications</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.prototype', 'Symbol.prototype')}}</td> + <td>{{Spec2('ES6')}}</td> + <td>Initial definition.</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.prototype', 'Symbol.prototype')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容">浏览器兼容</h2> + +<p>{{Compat("javascript.builtins.Symbol.prototype")}}</p> + +<div id="compat-mobile"></div> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/replace/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/replace/index.html new file mode 100644 index 0000000000..b5a5eeb5ea --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/replace/index.html @@ -0,0 +1,52 @@ +--- +title: Symbol.replace +slug: Web/JavaScript/Reference/Global_Objects/Symbol/replace +tags: + - JavaScript + - Symbol +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/replace +--- +<div>{{JSRef}}</div> + +<p><code><strong>Symbol.replace</strong></code> 这个属性指定了当一个字符串替换所匹配字符串时所调用的方法。{{jsxref("String.prototype.replace()")}} 方法会调用此方法。</p> + +<p>更多信息, 详见 {{jsxref("RegExp.@@replace", "RegExp.prototype[@@replace]()")}} 和 {{jsxref("String.prototype.replace()")}}。</p> + +<p>{{EmbedInteractiveExample("pages/js/symbol-replace.html")}}</p> + +<div>{{js_property_attributes(0,0,0)}}</div> + +<h2 id="Specifications">Specifications</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('ES2015', '#sec-symbol.replace', 'Symbol.replace')}}</td> + <td>{{Spec2('ES2015')}}</td> + <td>Initial definition.</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.replace', 'Symbol.replace')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="Browser_compatibility">Browser compatibility</h2> + +<p>{{Compat("javascript.builtins.Symbol.replace")}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{jsxref("Symbol.match")}}</li> + <li>{{jsxref("Symbol.search")}}</li> + <li>{{jsxref("Symbol.split")}}</li> + <li>{{jsxref("RegExp.@@replace", "RegExp.prototype[@@replace]()")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/search/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/search/index.html new file mode 100644 index 0000000000..c1efdd302e --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/search/index.html @@ -0,0 +1,113 @@ +--- +title: Symbol.search +slug: Web/JavaScript/Reference/Global_Objects/Symbol/search +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/search +--- +<div>{{JSRef}}</div> + +<div></div> + +<p><code>Symbol.search 指定了一个搜索方法,这个方法接受用户输入的正则表达式,返回该正则表达式在字符串中匹配到的下标,这个方法由以下的方法来调用 </code>{{jsxref("String.prototype.search()")}}。</p> + +<p>更多信息请参见 {{jsxref("RegExp.@@search", "RegExp.prototype[@@search]()")}} 和{{jsxref("String.prototype.search()")}}.</p> + +<div>{{js_property_attributes(0,0,0)}}</div> + +<h2 id="案例">案例</h2> + +<h3 id="自定义字符串搜索">自定义字符串搜索</h3> + +<pre class="notranslate">class caseInsensitiveSearch { + constructor(value) { + this.value = value.toLowerCase(); + } + [Symbol.search](string) { + return string.toLowerCase().indexOf(this.value); + } +} + +console.log('foobar'.search(new caseInsensitiveSearch('BaR'))); +// expected output: 3</pre> + +<h2 id="规范">规范</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('ES2015', '#sec-symbol.search', 'Symbol.search')}}</td> + <td>{{Spec2('ES2015')}}</td> + <td>规范中定义的几个部分</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.search', 'Symbol.search')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</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>基本支持</td> + <td>{{CompatChrome(50)}}</td> + <td>{{ CompatGeckoDesktop(49) }}</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>基本支持</td> + <td>{{CompatNo}}</td> + <td>{{CompatNo}}</td> + <td>{{ CompatGeckoMobile(49) }}</td> + <td>{{CompatNo}}</td> + <td>{{CompatNo}}</td> + <td>{{CompatNo}}</td> + </tr> + </tbody> +</table> +</div> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{jsxref("Symbol.match")}}</li> + <li>{{jsxref("Symbol.replace")}}</li> + <li>{{jsxref("Symbol.split")}}</li> + <li>{{jsxref("RegExp.@@search", "RegExp.prototype[@@search]()")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/species/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/species/index.html new file mode 100644 index 0000000000..aeb9918a47 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/species/index.html @@ -0,0 +1,73 @@ +--- +title: Symbol.species +slug: Web/JavaScript/Reference/Global_Objects/Symbol/species +tags: + - ECMAScript 2015 + - JavaScript + - Property + - Symbol +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/species +--- +<div>{{JSRef}}</div> + +<p>知名的<strong> </strong><code><strong>Symbol.species</strong></code> 是个函数值属性,其被构造函数用以创建派生对象。</p> + +<div>{{EmbedInteractiveExample("pages/js/symbol-species.html")}}</div> + + + +<div>{{js_property_attributes(0,0,0)}}</div> + +<h2 id="描述">描述</h2> + +<p>species 访问器属性允许子类覆盖对象的默认构造函数。</p> + +<h2 id="示例">示例</h2> + +<p>你可能想在扩展数组类 <code>MyArray </code>上返回 {{jsxref("Array")}} 对象。 例如,当使用例如 {{jsxref("Array.map", "map()")}} 这样的方法返回默认的构造函数时,你希望这些方法能够返回父级的 Array 对象,以取代 <code>MyArray</code> 对象。<code>Symbol.species</code> 允许你这么做:</p> + +<pre class="brush: js">class MyArray extends Array { + // 覆盖 species 到父级的 Array 构造函数上 + static get [Symbol.species]() { return Array; } +} +var a = new MyArray(1,2,3); +var mapped = a.map(x => x * x); + +console.log(mapped instanceof MyArray); // false +console.log(mapped instanceof Array); // true +</pre> + +<h2 id="规范">规范</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.species', 'Symbol.species')}}</td> + <td>{{Spec2('ES6')}}</td> + <td>Initial definition.</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.species', 'Symbol.species')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + + + +<p>{{Compat("javascript.builtins.Symbol.species")}}</p> + +<h2 id="相关链接">相关链接</h2> + +<ul> + <li>{{jsxref("Map.@@species", "Map[@@species]")}}</li> + <li>{{jsxref("Set.@@species", "Set[@@species]")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/split/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/split/index.html new file mode 100644 index 0000000000..53b98d57cd --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/split/index.html @@ -0,0 +1,117 @@ +--- +title: Symbol.split +slug: Web/JavaScript/Reference/Global_Objects/Symbol/split +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/split +--- +<div>{{JSRef}}</div> + +<p><code><strong>Symbol.split</strong></code> 指向 一个正则表达式的索引处分割字符串的方法。 这个方法通过 {{jsxref("String.prototype.split()")}} 调用。</p> + +<p>详情请参阅{{jsxref("RegExp.@@split", "RegExp.prototype[@@split]()")}} 和{{jsxref("String.prototype.split()")}}.</p> + +<div>{{EmbedInteractiveExample("pages/js/symbol-split.html")}}</div> + +<div class="hidden">The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> and send us a pull request.</div> + +<div>{{js_property_attributes(0,0,0)}}</div> + +<h2 id="示例">示例</h2> + +<p>[Symbol.split]指向‘aba’.split(/a/)</p> + +<pre class="brush: js notranslate">/a/[Symbol.split]('aba',3)</pre> + +<p>"dayinlove".split(exp)调用[Symbol.split](str)处理,并把实参"dayinlove"传给形参str</p> + +<pre class="brush: js notranslate">var exp = { + pat:'in', + [Symbol.split](str) { + return str.split(this.pat); + } + } + + "dayinlove".split(exp); +//["day", "love"]</pre> + +<h2 id="技术标准">技术标准</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">文档</th> + <th scope="col">状态</th> + <th scope="col">备注</th> + </tr> + <tr> + <td>{{SpecName('ES6', '#sec-symbol.split', 'Symbol.split')}}</td> + <td>{{Spec2('ES6')}}</td> + <td>初始定义.</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.split', 'Symbol.split')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</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>{{CompatChrome(50)}}</td> + <td>{{ CompatGeckoDesktop(49) }}</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(49) }}</td> + <td>{{CompatNo}}</td> + <td>{{CompatNo}}</td> + <td>{{CompatNo}}</td> + </tr> + </tbody> +</table> +</div> + +<h2 id="参阅">参阅</h2> + +<ul> + <li>{{jsxref("Symbol.match")}}</li> + <li>{{jsxref("Symbol.replace")}}</li> + <li>{{jsxref("Symbol.search")}}</li> + <li>{{jsxref("RegExp.@@split", "RegExp.prototype[@@split]()")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/toprimitive/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/toprimitive/index.html new file mode 100644 index 0000000000..61e4d36fb9 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/toprimitive/index.html @@ -0,0 +1,87 @@ +--- +title: Symbol.toPrimitive +slug: Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive +--- +<div>{{JSRef}}</div> + +<div></div> + +<p><code><strong>Symbol.toPrimitive</strong></code> 是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。</p> + +<div>{{EmbedInteractiveExample("pages/js/symbol-toprimitive.html")}}</div> + +<h2 id="描述">描述</h2> + +<p>在 <code>Symbol.toPrimitive</code> 属性(用作函数值)的帮助下,一个对象可被转换为原始值。该函数被调用时,会被传递一个字符串参数 <code>hint</code> ,表示要转换到的原始值的预期类型。 <code>hint</code> 参数的取值是 <code>"number"</code>、<code>"string"</code> 和 <code>"default"</code> 中的任意一个。</p> + +<p>{{js_property_attributes(0,0,0)}}</p> + +<h2 id="示例">示例</h2> + +<p>下面的例子展示了, <code>Symbol.toPrimitive</code> 属性是如何干扰一个对象转换为原始值时输出的结果的。</p> + +<pre class="brush: js">// 一个没有提供 Symbol.toPrimitive 属性的对象,参与运算时的输出结果 +var obj1 = {}; +console.log(+obj1); // NaN +console.log(`${obj1}`); // "[object Object]" +console.log(obj1 + ""); // "[object Object]" + +// 接下面声明一个对象,手动赋予了 Symbol.toPrimitive 属性,再来查看输出结果 +var obj2 = { + [Symbol.toPrimitive](hint) { + if (hint == "number") { + return 10; + } + if (hint == "string") { + return "hello"; + } + return true; + } +}; +console.log(+obj2); // 10 -- hint 参数值是 "number" +console.log(`${obj2}`); // "hello" -- hint 参数值是 "string" +console.log(obj2 + ""); // "true" -- hint 参数值是 "default" +</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">规范</th> + <th scope="col">状态</th> + <th scope="col">注释</th> + </tr> + <tr> + <td>{{SpecName('ES6', '#sec-symbol.toprimitive', 'Symbol.toPrimitive')}}</td> + <td>{{Spec2('ES6')}}</td> + <td>原始定义</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.toprimitive', 'Symbol.toPrimitive')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p> {{Compat("javascript.builtins.Symbol.toPrimitive")}}</p> + +<div id="compat-desktop"> +<table class="compat-table"> + <tbody> + </tbody> +</table> +</div> + +<h2 id="其他资料">其他资料</h2> + +<ul> + <li>{{jsxref("Date.@@toPrimitive", "Date.prototype[@@toPrimitive]")}}</li> + <li>{{jsxref("Symbol.@@toPrimitive", "Symbol.prototype[@@toPrimitive]")}}</li> + <li>{{jsxref("Object.prototype.toString()")}}</li> + <li>{{jsxref("Object.prototype.valueOf()")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/tosource/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/tosource/index.html new file mode 100644 index 0000000000..56d7571d55 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/tosource/index.html @@ -0,0 +1,93 @@ +--- +title: Symbol.prototype.toSource() +slug: Web/JavaScript/Reference/Global_Objects/Symbol/toSource +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/toSource +--- +<div>{{JSRef}} {{Non-standard_header}}</div> + +<p><code><strong>toSource()</strong></code> 方法返回代表该对象源码的字符串。</p> + +<p>该方法通常由JavaScript内部调用。</p> + +<h2 id="Syntax">Syntax</h2> + +<pre class="syntaxbox"><var>Symbol</var>.toSource() + +var sym = Symbol() +sym.toSource()</pre> + +<h2 id="Description">Description</h2> + +<p><code>toSource</code>方法返回以下值:</p> + +<p>对于内建<code>Symbol对象</code>, <code>toSource</code> 返回以下字符串,表明源代码不可见:</p> + +<pre class="brush:js">"function Symbol() { + [native code] +}"</pre> + +<p>对于<code>Symbol实例</code>, <code>toSource</code> 返回代表源码的字符串。</p> + +<pre class="brush: js">"Symbol()"</pre> + +<h2 id="Specifications">Specifications</h2> + +<p>还未成为任何标准的一部分</p> + +<h2 id="Browser_compatibility">Browser compatibility</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("36.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("36.0") }}</td> + <td>{{CompatNo}}</td> + <td>{{CompatNo}}</td> + <td>{{CompatNo}}</td> + </tr> + </tbody> +</table> +</div> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{jsxref("Object.prototype.toSource()")}} {{Non-standard_inline}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/tostring/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/tostring/index.html new file mode 100644 index 0000000000..1ed899232e --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/tostring/index.html @@ -0,0 +1,116 @@ +--- +title: Symbol.prototype.toString() +slug: Web/JavaScript/Reference/Global_Objects/Symbol/toString +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/toString +--- +<div>{{JSRef("Global_Objects", "Symbol")}}</div> + +<h2 id="Summary" name="Summary">概述</h2> + +<p><code><strong>toString()</strong></code> 方法返回当前 symbol 对象的字符串表示。</p> + +<h2 id="Syntax" name="Syntax">语法</h2> + +<pre class="syntaxbox"><var>symbol.toString()</var>;</pre> + +<h2 id="Description" name="Description">描述</h2> + +<p>{{jsxref("Symbol")}} 对象拥有自己的 <code>toString</code> 方法,因而遮蔽了原型链上的 {{jsxref("Object.prototype.toString()")}}。</p> + +<h3 id="symbol_原始值不能转换为字符串">symbol 原始值不能转换为字符串</h3> + +<p>symbol 原始值不能转换为字符串,所以只能先转换成它的包装对象,再调用 <code>toString()</code> 方法:</p> + +<pre class="brush: js">Symbol("foo") + "bar"; +// TypeError: Can't convert symbol to string +Symbol("foo").toString() + "bar" +// "Symbol(foo)bar",就相当于下面的: +Object(Symbol("foo")).toString() + "bar" +// "Symbol(foo)bar" +</pre> + +<h2 id="示例">示例</h2> + +<pre class="brush: js">Symbol("desc").toString(); // "Symbol(desc)" + +// well-known symbols +Symbol.iterator.toString(); // "Symbol(Symbol.iterator) + +// global symbols +Symbol.for("foo").toString() // "Symbol(foo)" +</pre> + +<h2 id="规范">规范</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.prototype.tostring', 'Symbol.prototype.toString')}}</td> + <td>{{Spec2('ES6')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</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>{{ CompatVersionUnknown() }}</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>{{ CompatVersionUnknown() }}</td> + <td>{{ CompatVersionUnknown() }}</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("Object.prototype.toString()")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/tostringtag/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/tostringtag/index.html new file mode 100644 index 0000000000..c09f904a6e --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/tostringtag/index.html @@ -0,0 +1,129 @@ +--- +title: Symbol.toStringTag +slug: Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag +--- +<div>{{JSRef}}</div> + +<p><strong><code>Symbol.toStringTag</code></strong> 是一个内置 symbol,它通常作为对象的属性键使用,对应的属性值应该为字符串类型,这个字符串用来表示该对象的自定义类型标签,通常只有内置的 {{jsxref("Object.prototype.toString()")}} 方法会去读取这个标签并把它包含在自己的返回值里。</p> + +<div>{{js_property_attributes(0,0,0)}}</div> + +<h2 id="描述">描述</h2> + +<p>许多内置的 JavaScript 对象类型即便没有 <code>toStringTag</code> 属性,也能被 <code>toString()</code> 方法识别并返回特定的类型标签,比如:</p> + +<pre class="brush: js">Object.prototype.toString.call('foo'); // "[object String]" +Object.prototype.toString.call([1, 2]); // "[object Array]" +Object.prototype.toString.call(3); // "[object Number]" +Object.prototype.toString.call(true); // "[object Boolean]" +Object.prototype.toString.call(undefined); // "[object Undefined]" +Object.prototype.toString.call(null); // "[object Null]" +// ... and more +</pre> + +<p>另外一些对象类型则不然,<code>toString()</code> 方法能识别它们是因为引擎为它们设置好了 <code>toStringTag</code> 标签:</p> + +<pre class="brush: js">Object.prototype.toString.call(new Map()); // "[object Map]" +Object.prototype.toString.call(function* () {}); // "[object GeneratorFunction]" +Object.prototype.toString.call(Promise.resolve()); // "[object Promise]" +// ... and more +</pre> + +<p>但你自己创建的类不会有这份特殊待遇,<code>toString() </code>找不到 <code>toStringTag</code> 属性时只好返回默认的 <code>Object</code> 标签:</p> + +<pre class="brush: js">class ValidatorClass {} + +Object.prototype.toString.call(new ValidatorClass()); // "[object Object]" +</pre> + +<p>加上 <code>toStringTag</code> 属性,你的类也会有自定义的类型标签了:</p> + +<pre class="brush: js">class ValidatorClass { + get [Symbol.toStringTag]() { + return "Validator"; + } +} + +Object.prototype.toString.call(new ValidatorClass()); // "[object Validator]" +</pre> + +<h2 id="规范">规范</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.tostringtag', 'Symbol.toStringTag')}}</td> + <td>{{Spec2('ES6')}}</td> + <td>Initial definition.</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.tostringtag', 'Symbol.toStringTag')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td> </td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</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>{{CompatChrome(49)}}</td> + <td>{{CompatGeckoDesktop(51)}}</td> + <td>{{CompatNo}}</td> + <td>{{CompatUnknown}}</td> + <td>{{CompatUnknown}}</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>{{CompatUnknown}}</td> + <td>{{CompatUnknown}}</td> + <td>{{CompatGeckoMobile(51)}}</td> + <td>{{CompatNo}}</td> + <td>{{CompatUnknown}}</td> + <td>{{CompatUnknown}}</td> + </tr> + </tbody> +</table> +</div> + +<h2 id="相关链接">相关链接</h2> + +<ul> + <li>{{jsxref("Object.prototype.toString()")}}</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/unscopables/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/unscopables/index.html new file mode 100644 index 0000000000..ab6483defd --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/unscopables/index.html @@ -0,0 +1,89 @@ +--- +title: Symbol.unscopables +slug: Web/JavaScript/Reference/Global_Objects/Symbol/unscopables +tags: + - ECMAScript 2015 + - JavaScript + - Property + - Symbol +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/unscopables +--- +<div>{{JSRef}}</div> + +<p><strong><code>Symbol.unscopables </code></strong>指用于指定对象值,其对象自身和继承的从关联对象的 with 环境绑定中排除的属性名称。</p> + +<div>{{EmbedInteractiveExample("pages/js/symbol-unscopables.html")}}</div> + +<h2 id="描述">描述</h2> + +<p>可以在任何对象上定义 <code>@@unscopables</code> symbol (<code>Symbol.unscopables</code>),用于排除属性名称并与 <code>with</code> 环境绑定在一起作为词法变量公开。 请注意,如果使用 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode">Strict mode</a>,语句将不可用,并且可能也不需要 symbol。</p> + +<p>在 <code>unscopables</code> 对象上设置属性为 true,将使其 <em>unscopable</em> 并且因此该属性也将不会在词法环境变量中出现。 如果设置属性为 <code>false</code> ,则将使其可 <code>scopable</code> 并且该属性会出现在词法环境变量中。</p> + +<p>{{js_property_attributes(0,0,0)}}</p> + +<h2 id="示例">示例</h2> + +<p>下列的代码可兼容 ES5 及以下版本。然而,在 ECMAScript 2015 (ES6) 或其后续版本中,{{jsxref("Array.prototype.keys()")}} 方法才会出现。意味着内部 <code>with</code> 环境“关键字” 存在该方法,但变量中不会存在。 也就是说,当 <code>unscopable</code>s symbol 被展示时,内置的<code>unscopables </code>设置是由 {{jsxref("Array.@@unscopables", "Array.prototype[@@unscopables]")}} 展示并实现的, 一些 Array 的方法 将作为 scoped 放入 <code>with</code> 语句中。</p> + +<pre class="brush: js">var keys = []; + +with(Array.prototype) { + keys.push("something"); +} + +Object.keys(Array.prototype[Symbol.unscopables]); +// ["copyWithin", "entries", "fill", "find", "findIndex", +// "includes", "keys", "values"] +</pre> + +<p>你也可以为你自己的对象设置 <code>unscopables</code> 。</p> + +<pre class="brush: js">var obj = { + foo: 1, + bar: 2 +}; + +obj[Symbol.unscopables] = { + foo: false, + bar: true +}; + +with(obj) { + console.log(foo); // 1 + console.log(bar); // ReferenceError: bar is not defined +} +</pre> + +<h2 id="规范">规范</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('ES2015', '#sec-symbol.unscopables', 'Symbol.unscopables')}}</td> + <td>{{Spec2('ES2015')}}</td> + <td>首次定义</td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-symbol.unscopables', 'Symbol.unscopables')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p>{{Compat("javascript.builtins.Symbol.unscopables")}}</p> + +<h2 id="相关链接">相关链接</h2> + +<ul> + <li>{{jsxref("Array.@@unscopables", "Array.prototype[@@unscopables]")}}</li> + <li><code><a href="/en-US/docs/Web/JavaScript/Reference/Statements/with">with</a></code> statement (not available in <a href="/en-US/docs/Web/JavaScript/Reference/Strict_mode">Strict mode</a>)</li> +</ul> diff --git a/files/zh-cn/web/javascript/reference/global_objects/symbol/valueof/index.html b/files/zh-cn/web/javascript/reference/global_objects/symbol/valueof/index.html new file mode 100644 index 0000000000..a5beee61d4 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/symbol/valueof/index.html @@ -0,0 +1,106 @@ +--- +title: Symbol.prototype.valueOf() +slug: Web/JavaScript/Reference/Global_Objects/Symbol/valueOf +translation_of: Web/JavaScript/Reference/Global_Objects/Symbol/valueOf +--- +<div>{{JSRef("Global_Objects", "Symbol")}}</div> + +<h2 id="Summary" name="Summary">概述</h2> + +<p><code><strong>valueOf()</strong></code> 方法返回当前 symbol 对象所包含的 symbol 原始值。</p> + +<h2 id="Syntax" name="Syntax">语法</h2> + +<pre class="syntaxbox"><var>symbol.valueOf(); +</var></pre> + +<h2 id="Description" name="Description">描述</h2> + +<p>在 JavaScript 中,虽然大多数类型的对象在某些操作下都会自动的隐式调用自身的 <code>valueOf()</code> 方法或者 <code>toString()</code> 方法来将自己转换成一个原始值,但 symbol 对象不会这么干,symbol 对象无法隐式转换成对应的原始值:</p> + +<pre class="brush: js">Object(Symbol("foo")) + "bar"; +// TypeError: can't convert symbol object to primitive +// 无法隐式的调用 valueOf() 方法 + +Object(Symbol("foo")).valueOf() + "bar"; +// TypeError: can't convert symbol to string +// 手动调用 valueOf() 方法,虽然转换成了原始值,但 symbol 原始值不能转换为字符串 + +Object(Symbol("foo")).toString() + "bar"; +// "Symbol(foo)bar",需要手动调用 toString() 方法才行 +</pre> + +<h2 id="规范">规范</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.prototype.valueof', 'Symbol.prototype.valueOf')}}</td> + <td>{{Spec2('ES6')}}</td> + <td>Initial definition.</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</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>{{ CompatVersionUnknown() }}</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>{{ CompatVersionUnknown() }}</td> + <td>{{ CompatVersionUnknown() }}</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("Object.prototype.valueOf()")}}</li> +</ul> |
