--- 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.length
Symbol
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}} |