--- title: Symbol slug: Web/JavaScript/Reference/Global_Objects/Symbol tags: - ECMAScript 2015 - JavaScript - NeedsTranslation - Symbol - TopicStub translation_of: Web/JavaScript/Reference/Global_Objects/Symbol ---
{{JSRef}}

Символ є {{Glossary("Primitive", "простим типом даних")}}. Функція  Symbol() вертає значення типу символ, має статичні властивості, що відкривають декілька членів вбудованих об'єктів, має статичні методи, що відкривають глобальний реєстр символів, та нагадує вбудований клас об'єкта, але не є повноцінним конструктором, оскільки не підтримує синтаксис "new Symbol()".

Кожне символьне значення, що його вертає Symbol(), є унікальним. Символьне значення може використовуватись в якості ідентифікатора властивостей об'єкта; це єдина мета цього типу даних. Більше пояснень щодо мети та використання можна знайти у статті словника щодо символів.

{{EmbedInteractiveExample("pages/js/symbol-constructor.html")}}

Синтаксис

Symbol([description])

Параметри

description {{optional_inline}}
Необов'язковий, рядок. Опис символу, який можна використовувати для відлагодження, але не для доступу для самого символу.

Опис

Для створення примітивного символа ви пишете Symbol() з необов'язковим рядком в ролі його опису:

var sym1 = Symbol();
var sym2 = Symbol('foo');
var sym3 = Symbol('foo');

Наведений код створює три нові символи. Зауважте, що Symbol("foo") не приводить рядок "foo" до символу. Він кожен раз створює новий символ:

Symbol('foo') === Symbol('foo'); // false

Наступний синтаксис з оператором {{jsxref("Operators/new", "new")}} викине помилку {{jsxref("TypeError")}}:

var sym = new Symbol(); // TypeError

Це запобігає створенню явного об'єкта-обгортки Symbol замість нового символьного значення та може дивувати, оскільки створення явного об'єкта-обгортки для примітивних типів даних загалом можливе (для прикладу, new Boolean, new String та new Number).

Якщо вам дуже потрібно створити об'єкт обгортку Symbol, ви можете скористатись функцією 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()")}} повертає масив символів та дозволяє знайти символьні властивості наданого об'єкта. Зауважте, що жоден об'єкт не ініціалізується з особистими символьними властивостями, отже, цей масив буде порожнім, якщо тільки ви не задали символьні властивості об'єкта.

Properties

Symbol.length
Length property whose value is 0.
{{jsxref("Symbol.prototype")}}
Represents the prototype for the Symbol constructor.

Well-known symbols

In addition to your own symbols, JavaScript has some built-in symbols which represent internal language behaviors which were not exposed to developers in ECMAScript 5 and before. These symbols can be accessed using the following properties:

Iteration symbols

{{jsxref("Symbol.iterator")}}
A method returning the default iterator for an object. Used by for...of.

Regular expression symbols

{{jsxref("Symbol.match")}}
A method that matches against a string, also used to determine if an object may be used as a regular expression. Used by {{jsxref("String.prototype.match()")}}.
{{jsxref("Symbol.replace")}}
A method that replaces matched substrings of a string. Used by {{jsxref("String.prototype.replace()")}}.
{{jsxref("Symbol.search")}}
A method that returns the index within a string that matches the regular expression. Used by {{jsxref("String.prototype.search()")}}.
{{jsxref("Symbol.split")}}
A method that splits a string at the indices that match a regular expression. Used by {{jsxref("String.prototype.split()")}}.

Other symbols

{{jsxref("Symbol.hasInstance")}}
A method determining if a constructor object recognizes an object as its instance. Used by {{jsxref("Operators/instanceof", "instanceof")}}.
{{jsxref("Symbol.isConcatSpreadable")}}
A Boolean value indicating if an object should be flattened to its array elements. Used by {{jsxref("Array.prototype.concat()")}}.
{{jsxref("Symbol.unscopables")}}
An object value of whose own and inherited property names are excluded from the with environment bindings of the associated object.
{{jsxref("Symbol.species")}}
A constructor function that is used to create derived objects.
{{jsxref("Symbol.toPrimitive")}}
A method converting an object to a primitive value.
{{jsxref("Symbol.toStringTag")}}
A string value used for the default description of an object. Used by {{jsxref("Object.prototype.toString()")}}.

Methods

{{jsxref("Symbol.for()", "Symbol.for(key)")}}
Searches for existing symbols with the given key and returns it if found. Otherwise a new symbol gets created in the global symbol registry with this key.
{{jsxref("Symbol.keyFor", "Symbol.keyFor(sym)")}}
Retrieves a shared symbol key from the global symbol registry for the given symbol.

Symbol prototype

All Symbols inherit from {{jsxref("Symbol.prototype")}}.

Properties

{{page('en-US/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Properties')}}

Methods

{{page('en-US/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Methods')}}

Examples

Using the typeof operator with symbols

The {{jsxref("Operators/typeof", "typeof")}} operator can help you to identify symbols.

typeof Symbol() === 'symbol'
typeof Symbol('foo') === 'symbol'
typeof Symbol.iterator === 'symbol'

Symbol type conversions

Some things to note when working with type conversion of symbols.

Symbols and for...in iteration

Symbols are not enumerable in for...in iterations. In addition, {{jsxref("Object.getOwnPropertyNames()")}} will not return symbol object properties, however, you can use {{jsxref("Object.getOwnPropertySymbols()")}} to get these.

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); // logs "c" and "d"
}

Symbols and JSON.stringify()

Symbol-keyed properties will be completely ignored when using JSON.stringify():

JSON.stringify({[Symbol('foo')]: 'foo'});
// '{}'

For more details, see {{jsxref("JSON.stringify()")}}.

Symbol wrapper objects as property keys

When a Symbol wrapper object is used as a property key, this object will be coerced to its wrapped symbol:

var sym = Symbol('foo');
var obj = {[sym]: 1};
obj[sym];            // 1
obj[Object(sym)];    // still 1

Specifications

Specification Status Comment
{{SpecName('ES2015', '#sec-symbol-objects', 'Symbol')}} {{Spec2('ES2015')}} Initial definition
{{SpecName('ESDraft', '#sec-symbol-objects', 'Symbol')}} {{Spec2('ESDraft')}}

Browser compatibility

{{CompatibilityTable}}

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support {{CompatChrome(38)}} {{CompatGeckoDesktop(36)}} {{CompatNo}} 25 9
Symbol.iterator (@@iterator) {{CompatChrome(38)}} {{CompatGeckoDesktop(36)}} {{CompatNo}} 25 9
Symbol.unscopables (@@unscopables) {{CompatChrome(38)}} {{CompatGeckoDesktop(48)}} {{CompatNo}} 25 9
Symbol.match (@@match) {{CompatChrome(50)}} {{CompatGeckoDesktop(40)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.species (@@species) {{CompatChrome(51)}} {{CompatGeckoDesktop(41)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.toPrimitive (@@toPrimitive) {{CompatChrome(48)}} {{CompatGeckoDesktop(44)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.replace (@@replace) {{CompatChrome(50)}} {{CompatGeckoDesktop(48)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.search (@@search) {{CompatChrome(50)}} {{CompatGeckoDesktop(48)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.split (@@split) {{CompatChrome(50)}} {{CompatGeckoDesktop(48)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.isConcatSpreadable (@@isconcatspreadable) {{CompatChrome(48)}} {{CompatGeckoDesktop(48)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.hasInstance (@@hasInstance) {{CompatChrome(51)}} {{CompatGeckoDesktop(50)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.toStringTag (@@toStringTag) {{CompatChrome(49)}} {{CompatGeckoDesktop(51)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support {{CompatUnknown}} {{CompatChrome(38)}} {{CompatGeckoMobile(36)}} {{CompatNo}} 25 9
Symbol.iterator (@@iterator) {{CompatUnknown}} {{CompatChrome(38)}} {{CompatGeckoMobile(36)}} {{CompatNo}} 25 9
Symbol.unscopables (@@unscopables) {{CompatUnknown}} {{CompatChrome(38)}} {{CompatGeckoMobile(48)}} {{CompatNo}} 25 9
Symbol.match (@@match) {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile(40)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.species (@@species) {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile(41)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.toPrimitive (@@toPrimitive) {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile(44)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.replace (@@replace) {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile(48)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.search (@@search) {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile(48)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.split (@@split) {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile(48)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.isConcatSpreadable (@@isconcatspreadable) {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile(48)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.hasInstance (@@hasInstance) {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile(50)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}
Symbol.toStringTag (@@toStringTag) {{CompatUnknown}} {{CompatUnknown}} {{CompatGeckoMobile(51)}} {{CompatNo}} {{CompatUnknown}} {{CompatUnknown}}

See also