--- 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 ---
{{JSRef}}

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.

Sintaxis

Symbol([description])

Parametros

Descripcion {{optional_inline}}
Es un valor opcional de tipo String. Únicamente sirve como descripción del símbolo que puede ser útil para depurar. No permite el acceso al símbolo que describe.

Descripción

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"

Símbolos compartidos en el registro global de símbolos

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.

Encontrando las claves de tipo símbolo de un objeto

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.

Propiedades

Symbol.length
La propiedad length cuyo valor es 0 para todos los símbolos.
{{jsxref("Symbol.prototype")}}
Representa el prototipo constructor Symbol. Es un objeto ordinario.

Símbolos bien conocidos

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.

Símbolo de iteración

{{jsxref("Symbol.iterator")}}
Los objetos que implementen la interfaz Iterable deben tener una propiedad que tenga como clave este símbolo. Dicha propiedad debe ser una función que devuelva un objeto que implemente la interfaz Iterator.  Usado por for...of.

Símbolos de expresiones regulares

{{jsxref("Symbol.match")}}
Un método que iguala a un String, también usado para determinar si un objeto puede ser usado como una expresión regular. Usado por {{jsxref("String.prototype.match()")}}.
{{jsxref("Symbol.replace")}}
Un método que reemplaza las subcadenas que coinciden con una cadena. Utilizado por {{jsxref("String.prototype.replace()")}}.
{{jsxref("Symbol.search")}}
Un método que devuelve el índice dentro de una cadena que coincide con la expresión regular. Utilizado por {{jsxref("String.prototype.search()")}}.
{{jsxref("Symbol.split")}}
Un método que separa una cadena en los índices que coincide una expresión regular. Utilizado por {{jsxref("String.prototype.split()")}}.

Otros símbolos

{{jsxref("Symbol.hasInstance")}}
Un método que determina si un objeto constructor reconoce al objeto como su instancia. Utilizado por {{jsxref("Operators/instanceof", "instanceof")}}.
{{jsxref("Symbol.isConcatSpreadable")}}
Un valor booleano que indica si un objeto debe ser aplanado a sus elementos de matriz. Usado por {{jsxref("Array.prototype.concat()")}}.
{{jsxref("Symbol.unscopables")}}
An Array of string values that are property values. These are excluded from the with environment bindings of the associated objects.
{{jsxref("Symbol.species")}}
Una función constructor utilizada para crear objetos derivados.
{{jsxref("Symbol.toPrimitive")}}
Un método para convertir un objeto a su valor primitivo.
{{jsxref("Symbol.toStringTag")}}
Un método para definir la descripción por defecto de un objeto. Usado por {{jsxref("Object.prototype.toString()")}}.

Métodos

{{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")}}.

Propiedades

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

Métodos

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

Ejemplos

Usando el operador typeof con  symbols

El operador {{jsxref("Operators/typeof", "typeof")}} puede ayudar a identificar los Symbol.

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 y el iterador 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"
}

Symbols y 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

Especificaciones

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

Compatibilidad del navegador

{{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}}

Mira también