--- title: Symbol slug: Web/JavaScript/Reference/Global_Objects/Symbol translation_of: Web/JavaScript/Reference/Global_Objects/Symbol original_slug: Web/JavaScript/Referencia/Objetos_globales/Symbol ---
Symbol es un tipo de datos cuyos valores son únicos e immutables. Dichos valores pueden ser utilizados como identificadores (claves) de las propiedades de los objetos. Cada valor del tipo Symbol tiene asociado un valor del tipo String o Undefined que sirve únicamente como descripción del símbolo.
La función Symbol
{{Glossary("Primitive", "primitive data type")}} es el constructor de valores del tipo Symbol. Cuando Symbol
es llamado como función nos devuelve una nuevo valor del tipo Symbol. El constructor Symbol
no debe ser usado con el operador new
. Tampoco debe ser extendido mediante clases.
Symbol([description])
Descripcion
{{optional_inline}}Para crear un nuevo símbolo, simplemente escribimos Symbol()
, opcionalmente con un argumento de tipo String que constituiría la descripción del símbolo:
var sym1 = Symbol(); var sym2 = Symbol("foo"); var sym3 = Symbol("foo");
El código anterior crea tres símbolos nuevos. Hay que destacar que Symbol("foo")
no convierte la cadena "foo" en un símbolo, sino que crea un símbolo nuevo que tiene la misma descripción.
Symbol("foo") === Symbol("foo"); // false
La siguiente sintaxis con el operador {{jsxref("Operators/new", "new")}} lanzará un {{jsxref("TypeError")}}:
var sym = new Symbol(); // TypeError
Esto evita la creación de un objeto envolvente explícito de Symbol en lugar de un nuevo valor de tipo símbolo. Si realmente se desea crear un Symbol
wrapper object, podemos usar la función Object()
:
var sym = Symbol("foo"); typeof sym; // "symbol" var symObj = Object(sym); typeof symObj; // "object"
La sintaxis anteriormente descrita que usa la función Symbol()
no creara un símbolo global disponible para toda el código base. Para crear símbolos accesibles a través de los archivos incluso a través de realms (cada uno de los cuales tiene su propio global scope) es necesario utilizar los métodos {{jsxref("Symbol.for()")}} y {{jsxref("Symbol.keyFor()")}} para crear y acceder a los símbolos desde un registro global de valores del tipo Symbol.
El método {{jsxref("Object.getOwnPropertySymbols()")}} devuelve un array con los símbolos que sirven como claves de las propiedades propias de un objeto. Hay que destacar que cada objeto es inicializado sin propiedades propias con claves de tipo Symbol, así que este array estará vacio a menos que se hayan creado explicitamente propiedades con clave de tipo símbolo en el objeto.
Symbol.length
length
cuyo valor es 0 para todos los símbolos.Symbol
. Es un objeto ordinario.JavaScript tiene algunos símbolos incorporados que representan comportamientos internos del lenguaje que no fueron expuestos a los programadores antes de ECMAScript 6. Se accede a los dichos símbolos a través de las siguientes propiedades del constructor Symbol.
for...of
.with
environment bindings of the associated objects.constructor
utilizada para crear objetos derivados.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
con symbolsEl operador {{jsxref("Operators/typeof", "typeof")}} puede ayudar a identificar los Symbol.
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
Symbols are not visible 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 |
{{CompatibilityTable}}
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | {{CompatChrome(38)}} | {{CompatGeckoDesktop("36.0")}} | {{CompatNo}} | 25 | 9 |
Symbol.iterator (@@iterator) | {{CompatChrome(38)}} | {{CompatGeckoDesktop("36.0")}} | {{CompatNo}} | 25 | 9 |
Symbol.unscopables (@@unscopables) | {{CompatChrome(38)}} | {{CompatNo}} | {{CompatNo}} | 25 | 9 |
Symbol.match (@@match) | {{CompatNo}} | {{CompatGeckoDesktop("40.0")}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
Symbol.species (@@species) | {{CompatNo}} | {{CompatGeckoDesktop("41.0")}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
Symbol.toPrimitive (@@toPrimitive) | {{CompatNo}} | {{CompatGeckoDesktop("44.0")}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
Other well-known symbols | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | {{CompatNo}} | {{CompatChrome(38)}} | {{ CompatGeckoMobile("36.0") }} | {{CompatNo}} | 25 | 9 |
Symbol.iterator (@@iterator) | {{CompatNo}} | {{CompatChrome(38)}} | {{ CompatGeckoMobile("36.0") }} | {{CompatNo}} | 25 | 9 |
Symbol.unscopables (@@unscopables) | {{CompatNo}} | {{CompatChrome(38)}} | {{CompatNo}} | {{CompatNo}} | 25 | 9 |
Symbol.match (@@match) | {{CompatNo}} | {{CompatNo}} | {{ CompatGeckoMobile("40.0") }} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
Symbol.species (@@species) | {{CompatNo}} | {{CompatNo}} | {{ CompatGeckoMobile("41.0") }} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
Symbol.toPrimitive (@@toPrimitive) | {{CompatNo}} | {{CompatNo}} | {{ CompatGeckoMobile("44.0") }} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |
Other well-known symbols | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} | {{CompatNo}} |