¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Símbolos
Módulo perteneciente al curso Programación avanzada con JavaScript y ECMAScript.
Introducción
Los símbolos son un elemento nuevo en ECMAScript que ofrece la posibilidad de crear valores únicos. Los símbolos son objetos de un tipo básico nuevo llamado symbol. Esos objetos son inmutables (el valor asociado a un símbolo no puede cambiarse después de su creación) y únicos (no hay dos símbolos con el mismo valor).
Creación de símbolos
Los símbolos se crean usando la función Symbol:
var s1 = Symbol("foo");
A la función Symbol se le pasa una cadena (no se admite llamar a Symbol sin parámetros) que sirve como identificador del símbolo. Pero aunque le pasemos la misma cadena a dos símbolos, cada uno de ellos es distinto para ECMAScript. Por ejemplo, el siguiente código crea dos símbolos distintos:
var s1 = Symbol("foo");
var s2 = Symbol("foo");
s1 === s2; // false
s1 == s2; // false
Tampoco hay conversión alguna entre el símbolo y la cadena que se haya usado para crearlo:
var s1 = Symbol("foo"); s1 === "foo"; // false s1 == "foo"; // false
A partir de la cadena que se haya usado como identificación del símbolo (foo en nuestros ejemplos) no hay manera de poder obtener el símbolo asociado a ella.
Fíjate en que la función Symbol no es una función constructora. Usar new Symbol genera un error.
Los símbolos son un tipo nuevo, es decir usar typeof sobre una variable de tipo símbolo no devolverá “object”, sino que devolverá “symbol”.
Los símbolos en general no se convierten de forma automática a ningún tipo, e intentar concatenar un símbolo con una cadena da error:
var s1 = Symbol("foo"); var str = s1 + "bar"; // TypeError
Un símbolo básicamente solo es igual a sí mismo o bien a un objeto creado con Object(s) siendo s el propio símbolo:
var s1 = Symbol("foo"); var obj = Object(s1); typeof(s1); // "symbol" typeof(obj); // "object" s1 == obj; // true s1 === obj; // false
Para convertir un símbolo en una cadena puede usarse String(s) (siendo s el símbolo), pero esto no devuelve la cadena que se haya usado como identificador, sino que devuelve una representación en formato cadena del símbolo:
var s1 = Symbol("foo"); var str = String(s1); //"Symbol(foo)" str == s1; // false str === s1; // false str == "foo"; // false str === "foo"; // false
