五阶魔方 發表於 2019-11-26 15:27:00

TypeScript symbol类型

<p>  自ECMAScript 2015(ES6)起,<code>symbol</code>成为了一种新的原生类型,就像基本类型<code>number</code>和<code>string</code>一样。</p>
<p>⒈介绍及使用方式</p>
<p>  TypeScript中使用symbol类型和JavaScript的使用方式如出一辙,也是通过<code></code><code>Symbol</code>构造函数创建的。</p>
<div class="cnblogs_code">
<pre>let sym1 =<span style="color: rgba(0, 0, 0, 1)"> Symbol();

let sym2 </span>= Symbol("key"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 可选的字符串key</span></pre>
</div>
<p>  需要注意的是,Symbols是不可改变且唯一的。</p>
<div class="cnblogs_code">
<pre>let sym2 = Symbol("key"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 可选的字符串key</span>
<span style="color: rgba(0, 0, 0, 1)">
let sym3 </span>= Symbol("key"<span style="color: rgba(0, 0, 0, 1)">);

console.log(sym2 </span>=== sym3); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> false, symbols是唯一的</span></pre>
</div>
<p>  通过同样的方式生成两个symbol也是不同的,因为symbol是唯一的,因此sym2和sym3无论如何都不会相等。</p>
<p>&nbsp;</p>
<p>  像字符串一样,symbols也可以用于对象属性的键。</p>
<div class="cnblogs_code">
<pre>let sym =<span style="color: rgba(0, 0, 0, 1)"> Symbol();

let obj </span>=<span style="color: rgba(0, 0, 0, 1)"> {
    : </span>"value"<span style="color: rgba(0, 0, 0, 1)">
};

console.log(obj); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> "value"</span></pre>
</div>
<p>  Symbols也可以与计算出的属性名声明相结合来声明对象的属性和类成员。</p>
<div class="cnblogs_code">
<pre>const getClassNameSymbol =<span style="color: rgba(0, 0, 0, 1)"> Symbol();

class C {
    (){
       </span><span style="color: rgba(0, 0, 255, 1)">return</span> "C"<span style="color: rgba(0, 0, 0, 1)">;
    }
}

let c </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> C();
let className </span>= c(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> "C"</span></pre>
</div>
<p>  在实际开发中,常量使用symbol值最大的好处就是,其他任何值都不可能有相同的值了,因此可以保证诸如特定字面量或者特定的switch语句值可以按设计的方式工作。</p>
<p>⒉一些常用方法</p>
<p>  除了用户定义的symbols,还有一些已经众所周知的内置symbols。 内置symbols用来表示语言内部的行为。</p>
<h2><code>Symbol.hasInstance</code></h2>
<p>方法,会被<code>instanceof</code>运算符调用。构造器对象用来识别一个对象是否是其实例。</p>
<h2><code>Symbol.isConcatSpreadable</code></h2>
<p>布尔值,表示当在一个对象上调用<code>Array.prototype.concat</code>时,这个对象的数组元素是否可展开。</p>
<h2 id="symboliterator"><code>Symbol.iterator</code></h2>
<p>方法,被<code>for-of</code>语句调用。返回对象的默认迭代器。</p>
<h2><code>Symbol.match</code></h2>
<p>方法,被<code>String.prototype.match</code>调用。正则表达式用来匹配字符串。</p>
<h2><code>Symbol.replace</code></h2>
<p>方法,被<code>String.prototype.replace</code>调用。正则表达式用来替换字符串中匹配的子串。</p>
<h2><code>Symbol.search</code></h2>
<p>方法,被<code>String.prototype.search</code>调用。正则表达式返回被匹配部分在字符串中的索引。</p>
<h2><code>Symbol.species</code></h2>
<p>函数值,为一个构造函数。用来创建派生对象。</p>
<h2><code>Symbol.split</code></h2>
<p>方法,被<code>String.prototype.split</code>调用。正则表达式来用分割字符串。</p>
<h2><code>Symbol.toPrimitive</code></h2>
<p>方法,被<code>ToPrimitive</code>抽象操作调用。把对象转换为相应的原始值。</p>
<h2><code>Symbol.toStringTag</code></h2>
<p>方法,被内置方法<code>Object.prototype.toString</code>调用。返回创建对象时默认的字符串描述。</p>
<h2><code>Symbol.unscopables</code></h2>
<p>对象,它自己拥有的属性会被<code>with</code>作用域排除在外。</p><br><br>
来源:https://www.cnblogs.com/fanqisoft/p/11935846.html
頁: [1]
查看完整版本: TypeScript symbol类型