自ECMAScript 2015(ES6)起,symbol
成為了一種新的原生類型,就像基本類型number
和string
一樣。
⒈介紹及使用方式
TypeScript中使用symbol類型和JavaScript的使用方式如出一轍,也是通過Symbol
構造函數創建的。
let sym1 = Symbol(); let sym2 = Symbol("key"); // 可選的字符串key
需要注意的是,Symbols是不可改變且唯一的。
let sym2 = Symbol("key"); // 可選的字符串key let sym3 = Symbol("key"); console.log(sym2 === sym3); // false, symbols是唯一的
通過同樣的方式生成兩個symbol也是不同的,因為symbol是唯一的,因此sym2和sym3無論如何都不會相等。
像字符串一樣,symbols也可以用於對象屬性的鍵。
let sym = Symbol(); let obj = { [sym]: "value" }; console.log(obj[sym]); // "value"
Symbols也可以與計算出的屬性名聲明相結合來聲明對象的屬性和類成員。
const getClassNameSymbol = Symbol(); class C { [getClassNameSymbol](){ return "C"; } } let c = new C(); let className = c[getClassNameSymbol](); // "C"
在實際開發中,常量使用symbol值最大的好處就是,其他任何值都不可能有相同的值了,因此可以保證諸如特定字面量或者特定的switch語句值可以按設計的方式工作。
⒉一些常用方法
除了用戶定義的symbols,還有一些已經眾所周知的內置symbols。 內置symbols用來表示語言內部的行為。
Symbol.hasInstance
方法,會被instanceof
運算符調用。構造器對象用來識別一個對象是否是其實例。
Symbol.isConcatSpreadable
布爾值,表示當在一個對象上調用Array.prototype.concat
時,這個對象的數組元素是否可展開。
Symbol.iterator
方法,被for-of
語句調用。返回對象的默認迭代器。
Symbol.match
方法,被String.prototype.match
調用。正則表達式用來匹配字符串。
Symbol.replace
方法,被String.prototype.replace
調用。正則表達式用來替換字符串中匹配的子串。
Symbol.search
方法,被String.prototype.search
調用。正則表達式返回被匹配部分在字符串中的索引。
Symbol.species
函數值,為一個構造函數。用來創建派生對象。
Symbol.split
方法,被String.prototype.split
調用。正則表達式來用分割字符串。
Symbol.toPrimitive
方法,被ToPrimitive
抽象操作調用。把對象轉換為相應的原始值。
Symbol.toStringTag
方法,被內置方法Object.prototype.toString
調用。返回創建對象時默認的字符串描述。
Symbol.unscopables
對象,它自己擁有的屬性會被with
作用域排除在外。