--- title: Symbol slug: Web/JavaScript/Reference/Global_Objects/Symbol tags: - ECMAScript6 - JavaScript - NeedsTranslation - Symbol - TopicStub translation_of: Web/JavaScript/Reference/Global_Objects/Symbol ---
A symbol is a unique and immutable data type. It may be used as an identifier for object properties. The Symbol object is an implicit object wrapper for the symbol {{Glossary("Primitive", "primitive data type")}}.
Symbol([description])
description
{{optional_inline}}To create a new primitive symbol, you write Symbol()
with an optional string as its description:
var sym1 = Symbol(); var sym2 = Symbol("foo"); var sym3 = Symbol("foo");
The above code creates three new symbols. Note that Symbol("foo")
does not coerce the string "foo" into a symbol. It creates a new symbol each time:
Symbol("foo") === Symbol("foo"); // false
The following syntax with the {{jsxref("Operators/new", "new")}} operator will throw a {{jsxref("TypeError")}}:
var sym = new Symbol(); // TypeError
This prevents authors from creating an explicit Symbol
wrapper object instead of a new symbol value and might be surprising as creating explicit wrapper objects around primitive data types is generally possible (for example, new Boolean
, new String
and new Number
).
If you really want to create a Symbol
wrapper object, you can use the Object()
function:
var sym = Symbol("foo"); typeof sym; // "symbol" var symObj = Object(sym); typeof symObj; // "object"
The above syntax using the Symbol()
function will not create a global symbol that is available in your whole codebase. To create symbols available across files and even across realms (each of which has its own global scope), use the methods {{jsxref("Symbol.for()")}} and {{jsxref("Symbol.keyFor()")}} to set and retrieve symbols from the global symbol registry.
The method {{jsxref("Object.getOwnPropertySymbols()")}} returns an array of symbols and lets you find symbol properties on a given object. Note that every object is initialized with no own symbol properties, so that this array will be empty unless you've set symbol properties on the object.
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('ES6', '#sec-symbol-objects', 'Symbol')}} | {{Spec2('ES6')}} | 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}} |