Символы
Начиная с 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.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» ассоциированных объектов.
© 2012-2023 Microsoft
Licensed under the Apache License, Version 2.0.
https://www.typescriptlang.org/docs/handbook/symbols.html