從 ECMAScript 2015 開始,symbol 是一種原始資料類型,就像 number 和 string 一樣。
symbol 值是透過呼叫 Symbol 建構函式建立的。
tslet sym1 = Symbol();let sym2 = Symbol("key"); // optional string key
符號是不可變且唯一的。
tslet sym2 = Symbol("key");let sym3 = Symbol("key");sym2 === sym3; // false, symbols are unique
就像字串一樣,符號可用作物件屬性的鍵。
tsconst sym = Symbol();let obj = {[sym]: "value",};console.log(obj[sym]); // "value"
符號也可以與計算屬性宣告結合,用來宣告物件屬性和類別成員。
tsconst getClassNameSymbol = Symbol();class C {[getClassNameSymbol]() {return "C";}}let c = new C();let className = c[getClassNameSymbol](); // "C"
unique symbol
若要將符號視為唯一文字,可以使用特殊類型 unique symbol。unique symbol 是 symbol 的子類型,僅能透過呼叫 Symbol() 或 Symbol.for(),或透過明確的類型註解產生。此類型僅允許在 const 宣告和 readonly static 屬性上使用,且若要參照特定唯一符號,您必須使用 typeof 算子。每個唯一符號的參照都暗示一個與特定宣告相關聯的完全唯一識別碼。
tsTrydeclare constsym1 : unique symbol;// sym2 can only be a constant reference.letA variable whose type is a 'unique symbol' type must be 'const'.1332A variable whose type is a 'unique symbol' type must be 'const'.: unique symbol = sym2 Symbol ();// Works - refers to a unique symbol, but its identity is tied to 'sym1'.letsym3 : typeofsym1 =sym1 ;// Also works.classC {static readonlyStaticSymbol : unique symbol =Symbol ();}
由於每個 unique symbol 都有完全獨立的識別碼,因此沒有兩個 unique symbol 類型可以相互指派或比較。
tsTryconstsym2 =Symbol ();constsym3 =Symbol ();if (This comparison appears to be unintentional because the types 'typeof sym2' and 'typeof sym3' have no overlap.2367This comparison appears to be unintentional because the types 'typeof sym2' and 'typeof sym3' have no overlap.sym2 ===sym3 ) {// ...}
已知符號
除了使用者定義的符號外,還有內建的已知符號。內建符號用於表示內部語言行為。
以下是已知符號的清單
Symbol.asyncIterator
傳回物件的非同步迭代器的方法,相容於用於 for await..of 迴圈。
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」環境繫結排除的屬性名稱。