--- title: Symbol slug: Web/JavaScript/Reference/Global_Objects/Symbol tags: - ECMAScript 2015 - JavaScript - NeedsTranslation - Symbol - TopicStub translation_of: Web/JavaScript/Reference/Global_Objects/Symbol ---
Символ є {{Glossary("Primitive", "простим типом даних")}}. Функція Symbol() вертає значення типу символ, має статичні властивості, що відкривають декілька членів вбудованих об'єктів, має статичні методи, що відкривають глобальний реєстр символів, та нагадує вбудований клас об'єкта, але не є повноцінним конструктором, оскільки не підтримує синтаксис "new Symbol()".
Кожне символьне значення, що його вертає Symbol(), є унікальним. Символьне значення може використовуватись в якості ідентифікатора властивостей об'єкта; це єдина мета цього типу даних. Більше пояснень щодо мети та використання можна знайти у статті словника щодо символів.
{{EmbedInteractiveExample("pages/js/symbol-constructor.html")}}
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
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()")}} повертає масив символів та дозволяє знайти символьні властивості наданого об'єкта. Зауважте, що жоден об'єкт не ініціалізується з особистими символьними властивостями, отже, цей масив буде порожнім, якщо тільки ви не задали символьні властивості об'єкта.
Symbol.lengthSymbol constructor.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:
for...of.with environment bindings of the associated object.Symbol prototypeAll Symbols inherit from {{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 operator with symbolsThe {{jsxref("Operators/typeof", "typeof")}} operator can help you to identify symbols.
typeof Symbol() === 'symbol'
typeof Symbol('foo') === 'symbol'
typeof Symbol.iterator === 'symbol'
Some things to note when working with type conversion of symbols.
+sym or sym | 0).Object(sym) == sym returns true.Symbol("foo") + "bar" throws a {{jsxref("TypeError")}} (can't convert symbol to string). This prevents you from silently creating a new string property name from a symbol, for example.String(sym) conversion works like a call to {{jsxref("Symbol.prototype.toString()")}} with symbols, but note that new String(sym) will throw.for...in iterationSymbols 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"
}
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()")}}.
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
| Specification | Status | Comment |
|---|---|---|
| {{SpecName('ES2015', '#sec-symbol-objects', 'Symbol')}} | {{Spec2('ES2015')}} | Initial definition |
| {{SpecName('ESDraft', '#sec-symbol-objects', 'Symbol')}} | {{Spec2('ESDraft')}} |
{{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}} |