Symbols
从 ECMAScript 2015 开始,symbol 成为一种原始数据类型,就像 number 和 string 一样。
symbol 值是通过调用 Symbol 构造函数创建的。
let sym1 = Symbol();
let sym2 = Symbol("key"); // 可选的字符串键Symbols 是不可变且唯一的。
let sym2 = Symbol("key");
let sym3 = Symbol("key");
sym2 === sym3; // false, symbols 是唯一的就像字符串一样,symbols 可以用作对象属性的键。
const sym = Symbol();
let obj = {
[sym]: "value",
};
console.log(obj[sym]); // "value"Symbols 还可以与计算属性声明结合使用,来声明对象属性和类成员。
const getClassNameSymbol = Symbol();
class C {
[getClassNameSymbol]() {
return "C";
}
}
let c = new C();
let className = c[getClassNameSymbol](); // "C"unique symbol
为了能够将 symbols 视为唯一的字面量,可以使用一种特殊的类型 unique symbol。unique symbol 是 symbol 的子类型,仅通过调用 Symbol() 或 Symbol.for(),或通过显式类型注解产生。此类型仅允许用于 const 声明和 readonly static 属性,并且要引用特定的唯一符号,你必须使用 typeof 运算符。对唯一符号的每个引用都意味着一个完全独立的身份,该身份与给定的声明绑定。
declare const sym1: unique symbol;
// sym2 只能是一个常量引用。
let sym2: unique symbol = Symbol();
// 可以 - 引用了一个唯一符号,但其身份与 'sym1' 绑定。
let sym3: typeof sym1 = sym1;
// 也可以。
class C {
static readonly StaticSymbol: unique symbol = Symbol();
}Try因为每个 unique symbol 都有一个完全独立的身份,所以没有两个 unique symbol 类型可以相互赋值或进行比较。
内置 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' 环境绑定中排除的属性名称。