mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-12-17 08:26:32 +08:00
语法高亮,滚动条美化,设置页面调整
This commit is contained in:
@@ -2,8 +2,8 @@
|
||||
<div></div>
|
||||
<p><code><strong>[@@toPrimitive]()</strong></code> 方法可将 Symbol 对象转换为原始值。</p>
|
||||
<h2 id="语法">语法</h2>
|
||||
<pre class="syntaxbox"><var>Symbol()[Symbol.toPrimitive](hint);
|
||||
</var></pre>
|
||||
<pre><code class="language-javascript"><var>Symbol()[Symbol.toPrimitive](hint);
|
||||
</var></code></pre>
|
||||
<h3 id="返回值">返回值</h3>
|
||||
<p>该原始值为指定的 <a href="Reference/Global_Objects/Symbol" title='Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:"new Symbol()"。'><code>Symbol</code></a> 对象</p>
|
||||
<h2 id="描述">描述</h2>
|
||||
|
||||
@@ -4,14 +4,14 @@
|
||||
<div><iframe class="interactive interactive-js" frameborder="0" height="250" src="https://interactive-examples.mdn.mozilla.net/pages/js/symbol-prototype-description.html" width="100%"></iframe></div>
|
||||
<p 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 class="external" href="https://github.com/mdn/interactive-examples" rel="noopener">https://github.com/mdn/interactive-examples</a> and send us a pull request.</p>
|
||||
<h2 id="语法">语法</h2>
|
||||
<pre class="syntaxbox">Symbol('myDescription').description;
|
||||
<pre><code class="language-javascript">Symbol('myDescription').description;
|
||||
Symbol.iterator.description;
|
||||
Symbol.for('foo').description;
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h2 id="描述">描述</h2>
|
||||
<p><a href="Reference/Global_Objects/Symbol" title='Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:"new Symbol()"。'><code>Symbol</code></a> 对象可以通过一个可选的描述创建,可用于调试,但不能用于访问 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)"
|
||||
<pre><code class="language-javascript">Symbol('desc').toString(); // "Symbol(desc)"
|
||||
Symbol('desc').description; // "desc"
|
||||
Symbol('').description; // ""
|
||||
Symbol().description; // undefined
|
||||
@@ -24,7 +24,7 @@ Symbol.iterator.description; // "Symbol.iterator"
|
||||
Symbol.for('foo').toString(); // "Symbol(foo)"
|
||||
Symbol.for('foo').description; // "foo"
|
||||
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h2 id="规范">规范</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div> </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>
|
||||
<pre><code class="language-javascript"><var>Symbol.for(key)</var>;</code></pre>
|
||||
<h3 id="参数">参数</h3>
|
||||
<dl>
|
||||
<dt>key</dt>
|
||||
@@ -32,7 +32,7 @@
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="示例">示例</h2>
|
||||
<pre class="brush: js">Symbol.for("foo"); // 创建一个 symbol 并放入 symbol 注册表中,键为 "foo"
|
||||
<pre><code class="language-javascript">Symbol.for("foo"); // 创建一个 symbol 并放入 symbol 注册表中,键为 "foo"
|
||||
Symbol.for("foo"); // 从 symbol 注册表中读取键为"foo"的 symbol
|
||||
|
||||
|
||||
@@ -43,11 +43,11 @@ Symbol("bar") === Symbol("bar"); // false,Symbol() 函数每次都会返回新
|
||||
var sym = Symbol.for("mario");
|
||||
sym.toString();
|
||||
// "Symbol(mario)",mario 既是该 symbol 在 symbol 注册表中的键名,又是该 symbol 自身的描述字符串
|
||||
</pre>
|
||||
</code></pre>
|
||||
<p>为了防止冲突,最好给你要放入 symbol 注册表中的 symbol 带上键前缀。</p>
|
||||
<pre class="brush: js">Symbol.for("mdn.foo");
|
||||
<pre><code class="language-javascript">Symbol.for("mdn.foo");
|
||||
Symbol.for("mdn.bar");
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h2 id="规范">规范</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
@@ -25,12 +25,12 @@
|
||||
</table></div>
|
||||
<h2 id="示例">示例</h2>
|
||||
<p><code><font face="Open Sans, Arial, sans-serif">例如,你可以这样来自定义 </font></code>MyArray 的 <code>instanceof </code>行为:</p>
|
||||
<pre class="brush: js">class MyArray {
|
||||
<pre><code class="language-javascript">class MyArray {
|
||||
static [Symbol.hasInstance](instance) {
|
||||
return Array.isArray(instance);
|
||||
}
|
||||
}
|
||||
console.log([] instanceof MyArray); // true</pre>
|
||||
console.log([] instanceof MyArray); // true</code></pre>
|
||||
<h2 id="规范">规范</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
@@ -31,25 +31,25 @@
|
||||
<h2 id="示例">示例</h2>
|
||||
<h3 id="数组">数组</h3>
|
||||
<p>默认情况下,<a href="Reference/Global_Objects/Array/concat" title="concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。"><code>Array.prototype.concat()</code></a> 展开其元素连接到结果中:</p>
|
||||
<pre class="brush: js">var alpha = ['a', 'b', 'c'],
|
||||
<pre><code class="language-javascript">var alpha = ['a', 'b', 'c'],
|
||||
numeric = [1, 2, 3];
|
||||
|
||||
var alphaNumeric = alpha.concat(numeric);
|
||||
|
||||
console.log(alphaNumeric); // 结果: ['a', 'b', 'c', 1, 2, 3]
|
||||
</pre>
|
||||
</code></pre>
|
||||
<p>设置<code>Symbol.isConcatSpreadable</code>为<code>false</code>:</p>
|
||||
<pre class="brush: js">var alpha = ['a', 'b', 'c'],
|
||||
<pre><code class="language-javascript">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>
|
||||
</code></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];
|
||||
<pre><code class="language-javascript">var x = [1, 2, 3];
|
||||
|
||||
var fakeArray = {
|
||||
[Symbol.isConcatSpreadable]: true,
|
||||
@@ -59,7 +59,7 @@ var fakeArray = {
|
||||
}
|
||||
|
||||
x.concat(fakeArray); // [1, 2, 3, "hello", "world"]
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h2 id="技术标准">技术标准</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
@@ -36,20 +36,20 @@
|
||||
<h2 id="示例">示例</h2>
|
||||
<h3 id="自定义迭代器">自定义迭代器</h3>
|
||||
<p>我们可以像下面这样创建自定义的迭代器:</p>
|
||||
<pre class="brush: js">var myIterable = {}
|
||||
<pre><code class="language-javascript">var myIterable = {}
|
||||
myIterable[Symbol.iterator] = function* () {
|
||||
yield 1;
|
||||
yield 2;
|
||||
yield 3;
|
||||
};
|
||||
[...myIterable] // [1, 2, 3]
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h3 id="不符合标准的迭代器">不符合标准的迭代器</h3>
|
||||
<p>如果一个迭代器 <code>@@iterator</code> 没有返回一个迭代器对象,那么它就是一个不符合标准的迭代器,这样的迭代器将会在运行期抛出异常,甚至非常诡异的 Bug。</p>
|
||||
<pre class="brush: js">var nonWellFormedIterable = {}
|
||||
<pre><code class="language-javascript">var nonWellFormedIterable = {}
|
||||
nonWellFormedIterable[Symbol.iterator] = () => 1
|
||||
[...nonWellFormedIterable] // TypeError: [] is not a function
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h2 id="规范">规范</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
@@ -3,14 +3,14 @@
|
||||
<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"><var>Symbol.keyFor(sym)</var>;</pre>
|
||||
<pre><code class="language-javascript"><var>Symbol.keyFor(sym)</var>;</code></pre>
|
||||
<h3 id="参数">参数</h3>
|
||||
<dl>
|
||||
<dt>sym</dt>
|
||||
<dd>存储在 symbol 注册表中的某个 symbol</dd>
|
||||
</dl>
|
||||
<h2 id="示例">示例</h2>
|
||||
<pre class="brush: js">// 创建一个 symbol 并放入 Symbol 注册表,key 为 "foo"
|
||||
<pre><code class="language-javascript">// 创建一个 symbol 并放入 Symbol 注册表,key 为 "foo"
|
||||
var globalSym = Symbol.for("foo");
|
||||
Symbol.keyFor(globalSym); // "foo"
|
||||
|
||||
@@ -20,7 +20,7 @@ Symbol.keyFor(localSym); // undefined,所以是找不到 key 的
|
||||
|
||||
// well-known symbol 们并不在 symbol 注册表中
|
||||
Symbol.keyFor(Symbol.iterator) // undefined
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h2 id="规范">规范</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
@@ -27,16 +27,16 @@
|
||||
<h2 id="示例">示例</h2>
|
||||
<h3 id="禁止表达式检查">禁止表达式检查</h3>
|
||||
<p>下面代码会抛出一个 <a href="Reference/Global_Objects/TypeError" title="TypeError(类型错误) 对象用来表示值的类型非预期类型时发生的错误。"><code>TypeError</code></a>:</p>
|
||||
<pre class="brush: js">"/bar/".startsWith(/bar/);
|
||||
<pre><code class="language-javascript">"/bar/".startsWith(/bar/);
|
||||
|
||||
// Throws TypeError, 因为 /bar/ 是一个正则表达式
|
||||
// 且 Symbol.match 没有修改。</pre>
|
||||
// 且 Symbol.match 没有修改。</code></pre>
|
||||
<p>但是,如果你将 <code>Symbol.match</code> 置为 <code>false,使用 match 属性的</code>表达式检查会认为该象不是正则表达式对象。<code>startsWith</code> 和 <code>endsWith</code> 方法将不会抛出 <code>TypeError</code>。</p>
|
||||
<pre class="brush: js">var re = /foo/;
|
||||
<pre><code class="language-javascript">var re = /foo/;
|
||||
re[Symbol.match] = false;
|
||||
"/foo/".startsWith(re); // true
|
||||
"/baz/".endsWith(re); // false
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h2 id="规范">规范</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<p>species 访问器属性允许子类覆盖对象的默认构造函数。</p>
|
||||
<h2 id="示例">示例</h2>
|
||||
<p>你可能想在扩展数组类 <code>MyArray </code>上返回 <a href="Reference/Array" title="REDIRECT Array"><code>Array</code></a> 对象。 例如,当使用例如 <a href="Reference/Global_Objects/Array/map" title="map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。"><code>map()</code></a> 这样的方法返回默认的构造函数时,你希望这些方法能够返回父级的 Array 对象,以取代 <code>MyArray</code> 对象。<code>Symbol.species</code> 允许你这么做:</p>
|
||||
<pre class="brush: js">class MyArray extends Array {
|
||||
<pre><code class="language-javascript">class MyArray extends Array {
|
||||
// 覆盖 species 到父级的 Array 构造函数上
|
||||
static get [Symbol.species]() { return Array; }
|
||||
}
|
||||
@@ -37,7 +37,7 @@ var mapped = a.map(x => x * x);
|
||||
|
||||
console.log(mapped instanceof MyArray); // false
|
||||
console.log(mapped instanceof Array); // true
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h2 id="规范">规范</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
@@ -25,9 +25,9 @@
|
||||
</table></div>
|
||||
<h2 id="示例">示例</h2>
|
||||
<p>[Symbol.split]指向‘aba’.split(/a/)</p>
|
||||
<pre class="brush: js">/a/[Symbol.split]('aba',3)</pre>
|
||||
<pre><code class="language-javascript">/a/[Symbol.split]('aba',3)</code></pre>
|
||||
<p>"dayinlove".split(exp)调用[Symbol.split](str)处理,并把实参"dayinlove"传给形参str</p>
|
||||
<pre class="brush: js">var exp = {
|
||||
<pre><code class="language-javascript">var exp = {
|
||||
pat:'in',
|
||||
[Symbol.split](str) {
|
||||
return str.split(this.pat);
|
||||
@@ -35,7 +35,7 @@
|
||||
}
|
||||
|
||||
"dayinlove".split(exp);
|
||||
//["day", "love"]</pre>
|
||||
//["day", "love"]</code></pre>
|
||||
<h2 id="技术标准">技术标准</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
<p>在 <code>Symbol.toPrimitive</code> 属性(用作函数值)的帮助下,一个对象可被转换为原始值。<code>该函数由字符串参数 hint 调用,</code>目的是指定原始值转换结果的首选类型。 hint 参数可以是<code>"number"、</code><code>"string" </code>和 <code>"default" 中的一种。</code></p>
|
||||
<h2 id="示例">示例</h2>
|
||||
<p>下列的例子展示了 <code>Symbol.toPrimitive</code> 属性如何将对象转换为原始值。</p>
|
||||
<pre class="brush: js">// 没有 Symbol.toPrimitive 属性的对象
|
||||
<pre><code class="language-javascript">// 没有 Symbol.toPrimitive 属性的对象
|
||||
var obj1 = {};
|
||||
console.log(+obj1); // NaN
|
||||
console.log(`${obj1}`); // "[object Object]"
|
||||
@@ -47,7 +47,7 @@ var obj2 = {
|
||||
console.log(+obj2); // 10 -- hint is "number"
|
||||
console.log(`${obj2}`); // "hello" -- hint is "string"
|
||||
console.log(obj2 + ""); // "true" -- hint is "default"
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h2 id="规范">规范</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
@@ -6,18 +6,18 @@
|
||||
<p><code><strong>toSource()</strong></code> 方法返回代表该对象源码的字符串。</p>
|
||||
<p>该方法通常由JavaScript内部调用。</p>
|
||||
<h2 id="Syntax">Syntax</h2>
|
||||
<pre class="syntaxbox"><var>Symbol</var>.toSource()
|
||||
<pre><code class="language-javascript"><var>Symbol</var>.toSource()
|
||||
|
||||
var sym = Symbol()
|
||||
sym.toSource()</pre>
|
||||
sym.toSource()</code></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() {
|
||||
<pre><code class="language-js">"function Symbol() {
|
||||
[native code]
|
||||
}"</pre>
|
||||
}"</code></pre>
|
||||
<p>对于<code>Symbol实例</code>, <code>toSource</code> 返回代表源码的字符串。</p>
|
||||
<pre class="brush: js">"Symbol()"</pre>
|
||||
<pre><code class="language-javascript">"Symbol()"</code></pre>
|
||||
<h2 id="Specifications">Specifications</h2>
|
||||
<p>还未成为任何标准的一部分</p>
|
||||
<h2 id="Browser_compatibility">Browser compatibility</h2>
|
||||
|
||||
@@ -3,27 +3,27 @@
|
||||
<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>
|
||||
<pre><code class="language-javascript"><var>symbol.toString()</var>;</code></pre>
|
||||
<h2 id="Description" name="Description">描述</h2>
|
||||
<p><a href="Reference/Global_Objects/Symbol" title='Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:"new Symbol()"。'><code>Symbol</code></a> 对象拥有自己的 <code>toString</code> 方法,因而遮蔽了原型链上的 <a href="Reference/Global_Objects/Object/toString" title="toString() 方法返回一个表示该对象的字符串。"><code>Object.prototype.toString()</code></a>。</p>
|
||||
<h3 id="symbol_原始值不能转换为字符串">symbol 原始值不能转换为字符串</h3>
|
||||
<p>symbol 原始值不能转换为字符串,所以只能先转换成它的包装对象,再调用 <code>toString()</code> 方法:</p>
|
||||
<pre class="brush: js">Symbol("foo") + "bar";
|
||||
<pre><code class="language-javascript">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>
|
||||
</code></pre>
|
||||
<h2 id="示例">示例</h2>
|
||||
<pre class="brush: js">Symbol("desc").toString(); // "Symbol(desc)"
|
||||
<pre><code class="language-javascript">Symbol("desc").toString(); // "Symbol(desc)"
|
||||
|
||||
// well-known symbols
|
||||
Symbol.iterator.toString(); // "Symbol(Symbol.iterator)
|
||||
|
||||
// global symbols
|
||||
Symbol.for("foo").toString() // "Symbol(foo)"
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h2 id="规范">规范</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
@@ -24,34 +24,34 @@
|
||||
</table></div>
|
||||
<h2 id="描述">描述</h2>
|
||||
<p>许多内置的 JavaScript 对象类型即便没有 <code>toStringTag</code> 属性,也能被 <code>toString()</code> 方法识别并返回特定的类型标签,比如:</p>
|
||||
<pre class="brush: js">Object.prototype.toString.call('foo'); // "[object String]"
|
||||
<pre><code class="language-javascript">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>
|
||||
</code></pre>
|
||||
<p>另外一些对象类型则不然,<code>toString()</code> 方法能识别它们是因为引擎为它们设置好了 <code>toStringTag</code> 标签:</p>
|
||||
<pre class="brush: js">Object.prototype.toString.call(new Map()); // "[object Map]"
|
||||
<pre><code class="language-javascript">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>
|
||||
</code></pre>
|
||||
<p>但你自己创建的类不会有这份特殊待遇,<code>toString() </code>找不到 <code>toStringTag</code> 属性时只好返回默认的 <code>Object</code> 标签:</p>
|
||||
<pre class="brush: js">class ValidatorClass {}
|
||||
<pre><code class="language-javascript">class ValidatorClass {}
|
||||
|
||||
Object.prototype.toString.call(new ValidatorClass()); // "[object Object]"
|
||||
</pre>
|
||||
</code></pre>
|
||||
<p>加上 <code>toStringTag</code> 属性,你的类也会有自定义的类型标签了:</p>
|
||||
<pre class="brush: js">class ValidatorClass {
|
||||
<pre><code class="language-javascript">class ValidatorClass {
|
||||
get [Symbol.toStringTag]() {
|
||||
return "Validator";
|
||||
}
|
||||
}
|
||||
|
||||
Object.prototype.toString.call(new ValidatorClass()); // "[object Validator]"
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h2 id="规范">规范</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<p>在 <code>unscopables</code> 对象上设置属性为 true,将使其 <em>unscopable</em> 并且因此该属性也将不会在词法环境变量中出现。 如果设置属性为 <code>false</code> ,则将使其可 <code>scopable</code> 并且该属性会出现在词法环境变量中。</p>
|
||||
<h2 id="示例">示例</h2>
|
||||
<p>下列的代码可兼容 ES5 及以下版本。然而,在 ECMAScript 2015 (ES6) 或其后续版本中,<a href="Reference/Global_Objects/Array/keys" title="keys() 方法返回一个包含数组中每个索引键的Array Iterator对象。"><code>Array.prototype.keys()</code></a> 方法才会出现。意味着内部 <code>with</code> 环境“关键字” 存在该方法,但变量中不会存在。 也就是说,当 <code>unscopable</code>s symbol 被展示时,内置的<code>unscopables </code>设置是由 <a href="Reference/Global_Objects/Array/@@unscopables" title="Symbol属性 @@unscopable 包含了所有 ES2015 (ES6) 中新定义的且并未被更早的 ECMAScript 标准收纳的属性名。这些属性并不包含在 with 语句绑定的环境中"><code>Array.prototype[@@unscopables]</code></a> 展示并实现的, 一些 Array 的方法 将作为 scoped 放入 <code>with</code> 语句中。</p>
|
||||
<pre class="brush: js">var keys = [];
|
||||
<pre><code class="language-javascript">var keys = [];
|
||||
|
||||
with(Array.prototype) {
|
||||
keys.push("something");
|
||||
@@ -36,9 +36,9 @@ with(Array.prototype) {
|
||||
Object.keys(Array.prototype[Symbol.unscopables]);
|
||||
// ["copyWithin", "entries", "fill", "find", "findIndex",
|
||||
// "includes", "keys", "values"]
|
||||
</pre>
|
||||
</code></pre>
|
||||
<p>你也可以为你自己的对象设置 <code>unscopables</code> 。</p>
|
||||
<pre class="brush: js">var obj = {
|
||||
<pre><code class="language-javascript">var obj = {
|
||||
foo: 1,
|
||||
bar: 2
|
||||
};
|
||||
@@ -52,7 +52,7 @@ with(obj) {
|
||||
console.log(foo); // 1
|
||||
console.log(bar); // ReferenceError: bar is not defined
|
||||
}
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h2 id="规范">规范</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
<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>
|
||||
<pre><code class="language-javascript"><var>symbol.valueOf();
|
||||
</var></code></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";
|
||||
<pre><code class="language-javascript">Object(Symbol("foo")) + "bar";
|
||||
// TypeError: can't convert symbol object to primitive
|
||||
// 无法隐式的调用 valueOf() 方法
|
||||
|
||||
@@ -17,7 +17,7 @@ Object(Symbol("foo")).valueOf() + "bar";
|
||||
|
||||
Object(Symbol("foo")).toString() + "bar";
|
||||
// "Symbol(foo)bar",需要手动调用 toString() 方法才行
|
||||
</pre>
|
||||
</code></pre>
|
||||
<h2 id="规范">规范</h2>
|
||||
<table class="standard-table">
|
||||
<tbody>
|
||||
|
||||
Reference in New Issue
Block a user