Skip to content
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待

Symbols

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

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

ts
let sym1 = Symbol();

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

Symbols 是不可变且唯一的。

ts
let sym2 = Symbol("key");
let sym3 = Symbol("key");

sym2 === sym3; // false, symbols 是唯一的

就像字符串一样,symbols 可以用作对象属性的键。

ts
const sym = Symbol();

let obj = {
  [sym]: "value",
};

console.log(obj[sym]); // "value"

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

ts
const getClassNameSymbol = Symbol();

class C {
  [getClassNameSymbol]() {
    return "C";
  }
}

let c = new C();
let className = c[getClassNameSymbol](); // "C"

unique symbol

为了能够将 symbols 视为唯一的字面量,可以使用一种特殊的类型 unique symbolunique symbolsymbol 的子类型,仅通过调用 Symbol()Symbol.for(),或通过显式类型注解产生。此类型仅允许用于 const 声明和 readonly static 属性,并且要引用特定的唯一符号,你必须使用 typeof 运算符。对唯一符号的每个引用都意味着一个完全独立的身份,该身份与给定的声明绑定。

ts
declare const 
sym1
: unique symbol;
// sym2 只能是一个常量引用。 let sym2: unique symbol =
Symbol
();
A variable whose type is a 'unique symbol' type must be 'const'.
// 可以 - 引用了一个唯一符号,但其身份与 '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.
// ... }
Try

内置 Symbols

除了用户定义的 symbols 之外,还有一些内置的 symbols。 内置 symbols 用于表示内部语言行为。

以下是内置 symbols 的列表:

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' 环境绑定中排除的属性名称。