符號

從 ECMAScript 2015 開始,symbol 是一種原始資料類型,就像 numberstring 一樣。

symbol 值是透過呼叫 Symbol 建構函式建立的。

ts
let sym1 = Symbol();
let sym2 = Symbol("key"); // optional string key

符號是不可變且唯一的。

ts
let sym2 = Symbol("key");
let sym3 = Symbol("key");
sym2 === sym3; // false, symbols are unique

就像字串一樣,符號可用作物件屬性的鍵。

ts
const sym = Symbol();
let obj = {
[sym]: "value",
};
console.log(obj[sym]); // "value"

符號也可以與計算屬性宣告結合,用來宣告物件屬性和類別成員。

ts
const getClassNameSymbol = Symbol();
class C {
[getClassNameSymbol]() {
return "C";
}
}
let c = new C();
let className = c[getClassNameSymbol](); // "C"

unique symbol

若要將符號視為唯一文字,可以使用特殊類型 unique symbolunique symbolsymbol 的子類型,僅能透過呼叫 Symbol()Symbol.for(),或透過明確的類型註解產生。此類型僅允許在 const 宣告和 readonly static 屬性上使用,且若要參照特定唯一符號,您必須使用 typeof 算子。每個唯一符號的參照都暗示一個與特定宣告相關聯的完全唯一識別碼。

ts
declare const sym1: unique symbol;
 
// sym2 can only be a constant reference.
let sym2: unique symbol = Symbol();
A variable whose type is a 'unique symbol' type must be 'const'.1332A variable whose type is a 'unique symbol' type must be 'const'.
 
// Works - refers to a unique symbol, but its identity is tied to 'sym1'.
let sym3: typeof sym1 = sym1;
 
// Also works.
class C {
static readonly StaticSymbol: unique symbol = Symbol();
}
Try

由於每個 unique symbol 都有完全獨立的識別碼,因此沒有兩個 unique symbol 類型可以相互指派或比較。

ts
const sym2 = Symbol();
const sym3 = Symbol();
 
if (sym2 === sym3) {
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.
// ...
}
Try

已知符號

除了使用者定義的符號外,還有內建的已知符號。內建符號用於表示內部語言行為。

以下是已知符號的清單

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」環境繫結排除的屬性名稱。

TypeScript 文件是一個開放原始碼專案。透過 傳送 Pull Request ❤ 來協助我們改善這些頁面

此頁面的貢獻者
MHMohamed Hegazy (52)
OTOrta Therox (15)
GBGabriel Burdeti (2)
MFMartin Fischer (1)
MNMichał Niedziółka (1)
9+

最後更新時間:2024 年 3 月 21 日