符号

从 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"

唯一符号

为了使符号能够作为唯一字面量进行处理,可以使用一种特殊的类型唯一符号唯一符号符号的子类型,并且只能通过调用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

由于每个唯一符号都有一个完全独立的标识,因此没有两个唯一符号类型可以相互赋值或比较。

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 日