
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 symbol
es 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 Boolean
, new String
y new 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()
y 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]()
y 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]()
y 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]()
y 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 Symbol
a 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:
+sym
osym | 0
) arroja un errorTypeError
. - Cuando usa el coeficiente igual (sin coincidir),
Object(sym) == sym
dicho valortrue
. - La
Symbol("foo") + "bar"
sintaxis arrojará el errorTypeError
, 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ónSymbol.prototype.toString()
cuando se trata de símbolos, pero tenga en cuenta que la funciónnew String(sym)
arrojará un errorTypeError
.
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ística | Chrome | Firefox | IE | Ópera | Safari |
---|---|---|---|---|---|
Soporte básico | 38 | 36 | No soportado | 25 | 9 |
Aunque IE no admite esta función, el navegador Edge la admite a partir de la versión 12.
- Expresión const en JavaScript
- Expresión let en JavaScript
- Expresión var en JavaScript
- Expresión try…catch en JavaScript
- Expresión throw en JavaScript
- Continue en JavaScript
- Switch en JavaScript
- Expresiones if…else en JavaScript
- Declaración vacía o empty en JavaScript
- Break en JavaScript
- Sentencia block en JavaScript
- Arguments en JavaScript
- Promise en JavaScript
- Number en JavaScript
- Características JSON en JavaScript
- Array en JavaScript
- RegExp en JavaScript
- String en JavaScript
- Date en JavaScript
- Math en JavaScript
- URIError en JavaScript
- TypeError en JavaScript
- SyntaxError en JavaScript
- ReferenceError en JavaScript
- RangeError en JavaScript
- EvalError en JavaScript
- Características Boolean en JavaScript
- Error en JavaScript
- Función Symbol en JavaScript
- Constructor Function en JavaScript
- Constructor Object en JavaScript
- Función unescape() en JavaScript
- Función eval() en JavaScript
- Valor null en JavaScript
- Características Undefined en JavaScript
- Características NaN en JavaScript
- Características Infinity en JavaScript
- Función parseFloat() en JavaScript
- Función isNaN() en JavaScript
- Función isFinite() en JavaScript
- Función escape() en JavaScript
- Función encodeURIComponent() en JavaScript