Дмитрий Нечаев
Symbols в TypeScript
Введение
В ECMAScript 2015 введен тип symbol
(символ) — примитивный тип данных, такой же, как number
и string
.
Значения типа symbol
создаются с помощью вызова конструктора Symbol
.
let sym1 = Symbol();
let sym2 = Symbol("key"); // Необязательный строковый ключ
Символы неизменяемы и уникальны.
let sym2 = Symbol("key");
let sym3 = Symbol("key");
sym2 === sym3; // false, символы уникальны
Подобно строкам, символы можно использовать как ключи для свойств объекта.
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"
Заранее определенные символы
Кроме символов, определяемых пользователем, существуют заранее определенные встроенные символы. Встроенные символы нужны для отражения внутреннего поведения языка.
Список заранее определенных символов:
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
для соответствующих объектов.
Карта развития разработчика
Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile