Symbols

从 ECMAScript 2015 开始,symbol 是一种原始数据类型,就像 numberstring 一样。

symbol 值是通过调用 Symbol 构造函数创建的。

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

Symbol 是不可变的,且是唯一的。

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

和字符串一样,Symbol 可以用作对象属性的键。

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

Symbol 还可以与计算属性声明结合使用,以声明对象属性和类成员。

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

unique symbol

为了能够将 Symbol 视为唯一的字面量,提供了一种特殊的类型 unique symbolunique symbolsymbol 的子类型,仅通过调用 Symbol()Symbol.for(),或者通过显式类型标注产生。此类型仅允许用于 const 声明和 readonly static 属性;要引用特定的唯一 Symbol,必须使用 typeof 运算符。对唯一 Symbol 的每一次引用都意味着与给定声明绑定在一起的完全唯一的标识。

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 (Well-known Symbols)

除了用户定义的 Symbol 外,还有众所周知的内置 Symbol。内置 Symbol 用于表示内部语言行为。

以下是众所周知的 Symbol 列表:

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+

最后更新:2026 年 3 月 27 日