Зачем нужен Symbol в JavaScript?
#code_pattern
В ECMAScript2015 (ES6) появился примитивный тип Symbol. Он используется, чтобы создавать уникальные идентификаторы. Пример:
const first = Symbol('example')
const second = Symbol('example')
first === first // true
first === second // false
Т.е. создать второй раз тот же самый идентификатор нельзя. Их используют для определения свойств объектов, т.е. обращения к его ключам.
Основное назначение Symbol это работа со встроенными фичами языка. Для этого существуют Well-known Symbols, такие как:
- Symbol.iterator
- Symbol.hasInstance
- Symbol.toStringTag
- и т.д., подробней об встроенных символах смотри
typescript doc или на
habr.
Well-known Symbols, используются на системном уровне программирования, т.е. на уровне библиотек и фреймворков. На прикладном уровне, т.е. на уровне написания кода приложения, а не библиотек, устоявшейся практикой является использование Symbol в декораторах на TypeScript. Пример:
import { SetMetadata } from '@nestjs/common';
export const isPublic = Symbol('isPublic');
export function Public() {
return SetMetadata(isPublic, true);
}
Таким образом можно вы можете гарантировать, что не произойдет коллизии в чтение/записи метаданных из ваших объектов.
Стоит еще знать об
Symbol.for и
Symbol.keyFor, которые позволяют работать с shared Symbol. По своей сути это глобальные переменные в shared Symbol scope, поэтому опытные программисты стараются их избегать.