Symbol

从 ECMAScript 2015 开始,symbol 成为一种基本数据类型,类似于 numberstring

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

ts
let sym1 = Symbol();
let sym2 = Symbol("key"); // 可选的字符串键

Symbol 不可变且唯一。

ts
let sym2 = Symbol("key");
let sym3 = Symbol("key");
sym2 === sym3; // false,symbol 唯一

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 视为唯一字面量,TypeScript 提供了一种特殊类型 unique symbolunique symbolsymbol 的子类型,仅能通过调用 Symbol()Symbol.for(),或通过显式类型注解生成。此类型只能用于 const 声明和 readonly static 属性。要引用特定的唯一 symbol ,必须使用 typeof 操作符。每个对唯一 symbol 的引用都意味着与给定声明关联的完全独特的身份。

ts
declare const sym1: unique symbol;
 
// sym2 只能是常量引用。
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'.
 
// 正常工作——引用一个唯一 symbol ,但其身份与‘sym1’绑定。
let sym3: typeof sym1 = sym1;
 
// 也正常工作。
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

除了用户自定义的 symbol 外,JavaScript 还提供了一些内置的著名 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’ 环境绑定中排除的属性名称。

The TypeScript docs are an open source project. Help us improve these pages by sending a Pull Request

Contributors to this page:
MHMohamed Hegazy  (52)
  (6)
GBGabriel Burdeti  (2)
Ff  (1)
Uuser135711  (1)
6+

Last updated: 2024年11月22日