# 符号

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

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

let sym1 = Symbol();

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

符号是不可变的,并且是唯一的。

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

sym2 === sym3; // false, symbols are unique

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

const sym = Symbol();

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

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

符号也可以与计算属性声明相结合来声明对象属性和类成员。

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运算符。每个对唯一符号的引用都意味着与给定声明相关联的完全唯一标识。

declare const sym1: unique symbol;

// sym2 can only be a constant reference.
let sym2: unique symbol = Symbol();

// 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();
}

因为每个 unique symbol都有一个完全独立的标识,所以没有两个 unique symbol类型可以分配或相互比较。

const sym2 = Symbol();
const sym3 = Symbol();

if (sym2 === sym3) {
  // ...
}

# 知名符号

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

以下是知名符号的列表:

# Symbol.hasInstance

一种确定构造函数对象是否将对象识别为构造函数实例之一的方法。由 instanceof 运算符的语义调用。

# Symbol.isConcatSpreadable

一个布尔值,指示对象应通过 Array.prototype.concat 展平为其数组元素。

# Symbol.iterator

返回对象的默认迭代器的方法。由 for-of 语句的语义调用。

# Symbol.match

将正则表达式与字符串匹配的正则表达式方法。由 String.prototype.match方法调用。

# Symbol.replace

替换字符串的匹配子字符串的正则表达式方法。由 String.prototype.replace方法调用。

一种正则表达式方法,它返回与正则表达式匹配的字符串中的索引。由 String.prototype.search方法调用。

# Symbol.species

一个函数值属性,它是用于创建派生对象的构造函数。

# Symbol.split

一种在与正则表达式匹配的索引处拆分字符串的正则表达式方法。由 String.prototype.split方法调用。

# Symbol.toPrimitive

一种将对象转换为相应原始值的方法。由 ToPrimitive抽象操作调用。

# Symbol.toStringTag

一个字符串值,用于创建对象的默认字符串描述。由内置方法 Object.prototype.toString调用。

# Symbol.unscopables

一个对象,其自身的属性名称是从关联对象的 'with' 环境绑定中排除的属性名称。

Last Updated: 5/25/2023, 2:35:11 PM