Función Symbol en JavaScript

Función Symbol‎‎‎‎ en JavaScript
Función Symbol‎‎‎‎ en JavaScript

La función Symbol en javascript devuelve un valor de tipo symbol. Esta función tiene propiedades estáticas y funciones estáticas (que se utilizan para acceder al registro global de símbolos, también llamado tabla de símbolos). La función está tratando de imitar las funciones constructoras de objetos, pero no es un constructor porque no es posible usar el operador new con él como en new Symbol()‎.

Cada símbolo devuelto por la función Symbol() es un símbolo único. Se puede utilizar como identificador de propiedades de objetos, que es el objetivo principal de este tipo de datos. Tenga en cuenta que el tipo de datos symboles un tipo de datos primitivo.

Características generales

Para crear un símbolo primitivo, puede usar la función Symbol()‎ con o sin pasarle una cadena opcional:

var sym1 = Symbol();
var sym2 = Symbol('foo');
var sym3 = Symbol('foo');

El código anterior genera tres nuevos caracteres. Tenga en cuenta que la función Symbol("foo")no convierte la cadena "foo"en un token, pero generará uno nuevo cada vez que se llame.

Symbol('foo') === Symbol('foo'); // false

Tenga en cuenta que el uso de la función Symbol con un operando new arrojará TypeError:

var sym = new Symbol(); // TypeError

Lo anterior evita que los programadores creen un objeto para Symbol encapsular valores primitivos en lugar de crear código nuevo, y este comportamiento puede sorprender a algunos porque la creación de objetos que encapsulan valores primitivos está permitida en JavaScript (por ejemplo, el uso de new Booleannew Stringnew Number). Pero si desea crear un objeto que encapsule un valor bruto del tipo Symbol, puede usar el constructor Object():

var sym = Symbol('foo');
typeof sym;     // "symbol" 
var symObj = Object(sym);
typeof symObj;  // "object"

El uso de la función Symbol() en javascript como se indicó anteriormente no generará un token genérico que esté disponible en toda su aplicación. Para crear símbolos que estén disponibles en más de un archivo, use la función Symbol.for()Symbol.keyFor()‎ para establecer y obtener símbolos del registro de símbolos global.

La función Object.getOwnPropertySymbols()‎ devuelve una matriz que contiene todos los símbolos utilizados en el objeto. Tenga en cuenta que todos los objetos se inicializan sin ningún token en ellos, por lo que esta matriz estará vacía a menos que establezca tokens en el objeto.

Symbol.length

El valor de la propiedad length, que es 0.

Symbol.prototype

Este es el objeto prototipo de la función Symbol.

Estructura Symbol javascript

Symbol([description])

description

Argumento opcional, una descripción textual del código que se puede utilizar con fines de depuración pero no para acceder al código en sí.

Funciones symbol javascript

Además de los símbolos que definimos mediante la función Symbol, JavaScript tiene símbolos integrados que representan el comportamiento interno del lenguaje, que no estaban disponibles para los desarrolladores en ECMAScript 5 y versiones anteriores. Se puede acceder a los símbolos conocidos a través de las siguientes propiedades.

Symbol de rotación

Symbol.iterator

Una función que devuelve el iterador predeterminado de un objeto, que se usa desde for...of.

Symbol.asyncIterator

Esta función devuelve el AsyncIterator valor predeterminado para un objeto, que se usa desde el for await of. Tenga en cuenta que esta función aún es experimental.

Símbolos de expresión

Symbol.match

Una función que coincide con una cadena de texto y también se usa para determinar si el objeto se puede usar como una expresión regular. Se usa desde la función String.prototype.match()‎.

Symbol.replace

Este conocido símbolo especifica la función que reemplazará parte de una cadena. Esta función se llamará desde la función String.prototype.replace()‎. Para obtener más información, consulte RegExp.prototype[@@replace]()‎String.prototype.replace()‎.

Symbol.search

Este conocido símbolo especifica la función que devolverá un índice dentro de una cadena de texto que coincide con la expresión regular. Esta función se llamará desde la función String.prototype.search()‎.

Para obtener más información, consulte RegExp.prototype[@@search]()‎String.prototype.search()‎.

Symbol.split

Este conocido símbolo especifica la función que dividirá una cadena de texto en índices que coincidan con una expresión regular. Esta función se llamará desde la función String.prototype.split()‎.

Para obtener más información, consulte la página RegExp.prototype[@@split]()‎String.prototype.split()‎.

Otros iconos

Symbol.hasInstance

Una función que determina si el constructor reconoce un objeto como un objeto del que se deriva. Es utilizado por laboratorios instanceof. El comportamiento del parámetro se puede personalizar instanceof usando este código. Puede personalizar el comportamiento del parámetro instanceof como en el siguiente ejemplo:

class MyArray {  
  static [Symbol.hasInstance](instance) {
    return Array.isArray(instance);
  }
}
console.log([] instanceof MyArray); // true

Symbol.isConcatSpreadable

Un valor booleano que especifica si un objeto debe «acoplarse» a los elementos de la matriz. Este símbolo se usa desde la función Array.prototype.concat()‎.

Symbol.species

Una función utilizada para crear objetos derivados.

Symbol.toPrimitive

Una función utilizada para convertir un objeto en un valor inicial.

Symbol.toStringTag

Una cadena utilizada en la descripción predeterminada del objeto, y este código se utiliza desde Object.prototype.toString()‎.

Otras funciones Symbol

Symbol.for(key)‎

Buscar símbolos con la clave asignada y devolverlos si los hubiera. De lo contrario, se creará un nuevo token en el registro de código global con esta clave.

Symbol.keyFor(sym)‎

Obtenga la clave de símbolo dada del registro de símbolo público.

Symbol.prototype.constructor

Todos los símbolos heredan del objeto Symbol.prototype. Especifica la función que creará el objeto prototipo del símbolo, que es la función Symbol por defecto.

Symbol.prototype.toString()‎

Devuelve una cadena que contiene una descripción del símbolo, que redefine la función Object.prototype.toString()‎.

Symbol.prototype.valueOf()‎

Symbol devuelve el valor inicial de un objeto y redefine la función Object.prototype.valueOf()‎.

Symbol.prototype[@@toPrimitive]‎

Convierta el objeto Symbola un valor inicial.

Ejemplos y aplicaciones en código

Usando el operador typeof con símbolos. El operando se puede utilizar typeof para reconocer símbolos:

typeof Symbol() === 'symbol'
typeof Symbol('foo') === 'symbol'
typeof Symbol.iterator === 'symbol'

A continuación, se indican algunos aspectos que debe tener en cuenta al intentar convertir valores de símbolo en otros tipos de datos:

  • Al intentar convertir un símbolo en un número (por ejemplo: ‎+symsym | 0) arroja un error TypeError.
  • Cuando usa el coeficiente igual (sin coincidir), Object(sym) == sym dicho valor true.
  • La Symbol("foo") + "bar"‎sintaxis arrojará el error TypeError, y esto evitará la creación de propiedades con claves de texto derivadas de símbolos.
  • Usar la función String(sym) es lo mismo que usar la función Symbol.prototype.toString()‎ cuando se trata de símbolos, pero tenga en cuenta que la función new String(sym)‎ arrojará un error TypeError.

Símbolos e iteración de bucles for...in. No es posible pasar símbolos usando el bucle for...in. Además, la función Object.getOwnPropertyNames() no devuelve propiedades simbólicas. La función debe usarse Object.getOwnPropertySymbols()‎ para devolver propiedades simbólicas:

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); // "c" "d"
}

Símbolos y función JSON.stringify()‎. Las propiedades simbólicas se ignorarán por completo al usar la función JSON.stringify()‎:

JSON.stringify({[Symbol('foo')]: 'foo'});                 
// '{}'

Embalaje de iconos, cuando se utiliza un contenedor de objeto para un símbolo como clave de una propiedad, convertirá el objeto en el símbolo que encapsula:

var sym = Symbol('foo');
var obj = {[sym]: 1};
obj[sym];            // 1
obj[Object(sym)];    // 1

Soporte de navegadores

CaracterísticaChromeFirefoxIEÓperaSafari
Soporte básico3836No soportado259

Aunque IE no admite esta función, el navegador Edge la admite a partir de la versión 12.