--- title: Symbol slug: Web/JavaScript/Reference/Global_Objects/Symbol tags: - API - ECMAScript6 - JavaScript - Symbol - Символы translation_of: Web/JavaScript/Reference/Global_Objects/Symbol ---
Символ (анг. Symbol) — это уникальный и неизменяемый тип данных, который может быть использован как идентификатор для свойств объектов. Символьный объект (анг. symbol object) — это объект-обёртка (англ. wrapper) для {{Glossary("Primitive", "примитивного")}} символьного типа.
Symbol([описание])
описание
{{optional_inline}}Чтобы создать новый символьный примитив, достаточно написать Symbol()
, указав по желанию строку в качестве описания этого символа:
var sym1 = Symbol(); var sym2 = Symbol("foo"); var sym3 = Symbol("foo");
Код выше создает три новых символа. Заметьте, что Symbol("foo")
не выполняет приведение (англ. coercion) строки "foo" к символу. Это выражение создает каждый раз новый символ:
Symbol("foo") === Symbol("foo"); // false
Код ниже с оператором {{jsxref("Operators/new", "new")}} бросит исключение {{jsxref("TypeError")}}:
var sym = new Symbol(); // TypeError
Это удерживает разработчиков от создания явного объекта-обёртки Symbol
вместо нового символьного значения. Создание явных объектов-обёрток для примитивных типов доступно (например, new Boolean
, new String
, new Number
).
Если вам действительно необходимо обернуть символ в объект, вы можете использовать функцию Object()
:
var sym = Symbol("foo"); typeof sym; // "symbol" var symObj = Object(sym); typeof symObj; // "object"
Приведенный выше синтаксис, использующий функцию Symbol(),
не создаст глобальный символ, который был бы доступен в любом месте вашего кода. Для создания символов, доступных во всех файлах и в окружении (глобальной области), используйте методы {{jsxref("Symbol.for()")}} и {{jsxref("Symbol.keyFor()")}}, чтобы задать или получить символ из глобального символьного реестра.
Метод {{jsxref("Object.getOwnPropertySymbols()")}} возвращает массив символов и позволяет получить символьные свойства конкретного объекта. Следует заметить, что при инициализации объекты не получают символьных свойств, так что этот массив будет пуст, пока вы не зададите ему какое-либо символьное свойство.
Symbol.length
Symbol
.В добавок к вашим собственным символам, JavaScript имеет несколько встроенных символов, представляющих внутренние механизмы языка, которые не были доступны разработчикам в версиях ECMAScript 5 и более ранних. Эти символы доступны посредством следующих свойств:
Прототип Symbol
Все символы наследуют от {{jsxref("Symbol.prototype")}}.
{{page('en-US/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Properties')}}
{{page('en-US/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Methods')}}
typeof
с символамиОператор {{jsxref("Operators/typeof", "typeof")}} позволяет идентифицировать символ.
typeof Symbol() === 'symbol' typeof Symbol('foo') === 'symbol' typeof Symbol.iterator === 'symbol'
Следующее необходимо помнить при преобразовании типа символов.
+sym
или sym | 0
).Object(sym) == sym
, будет true.
Symbol("foo") + "bar"
бросает исключение {{jsxref("TypeError")}} (невозможно преобразовать символ в строку). Это удерживает разработчика от, к примеру, случайного создания строкого поля у объекта из символа.String(sym)
работает с символами как вызов {{jsxref("Symbol.prototype.toString()")}}. Заметьте, что в то же время new String(sym)
бросит исключение.for...in
Символы не перечисляются при итерации {{jsxref("Statements/for...in","for...in")}}. В дополнение к этому, {{jsxref("Object.getOwnPropertyNames()")}} не вернет символьные свойства объекта. Тем не менее, их можно получить с помощью {{jsxref("Object.getOwnPropertySymbols()")}}.
var obj = {}; obj[Symbol("a")] = "a"; obj[Symbol.for("b")] = "b"; obj["c"] = "c"; obj.d = "d"; for (var i in obj) { console.log(i); // выведет "c" и "d" }
JSON.stringify()
JSON.stringify() игнорирует свойства с ключами Symbol
:
JSON.stringify({[Symbol("foo")]: "foo"}); // '{}'
Подробности см. {{jsxref("JSON.stringify()")}}.
Когда объект-обёртка символа используется в качестве имени свойства, этот объект сводится к символу, который он оборачивает:
var sym = Symbol("foo"); var obj = {[sym]: 1}; obj[sym]; // 1 obj[Object(sym)]; // снова 1
Спецификация | Статус | Комментарий |
---|---|---|
{{SpecName('ES6', '#sec-symbol-objects', 'Symbol')}} | {{Spec2('ES6')}} | Изначальное определение |
{{SpecName('ESDraft', '#sec-symbol-objects', 'Symbol')}} | {{Spec2('ESDraft')}} |
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
{{Compat("javascript.builtins.Symbol")}}