# 符号
从 ECMAScript 2015 开始,symbol
是原始数据类型,就像 number
和 string
一样。
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 symbol
。unique symbol
是 symbol
的子类型,仅通过调用 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
方法调用。
# Symbol.search
一种正则表达式方法,它返回与正则表达式匹配的字符串中的索引。由 String.prototype.search
方法调用。
# Symbol.species
一个函数值属性,它是用于创建派生对象的构造函数。
# Symbol.split
一种在与正则表达式匹配的索引处拆分字符串的正则表达式方法。由 String.prototype.split
方法调用。
# Symbol.toPrimitive
一种将对象转换为相应原始值的方法。由 ToPrimitive
抽象操作调用。
# Symbol.toStringTag
一个字符串值,用于创建对象的默认字符串描述。由内置方法 Object.prototype.toString
调用。
# Symbol.unscopables
一个对象,其自身的属性名称是从关联对象的 'with' 环境绑定中排除的属性名称。