template support strings ecmascript javascript ecmascript-6 symbols

support - template string javascript html



¿Puedo confiar en la representación de cadena de un `Símbolo` ES6? (2)

Lo único que se puede agregar a la respuesta de @Xufox es que Symbol.prototype.toString podría verse comprometido (sobrescrito), en cuyo caso podría devolver algo más. Dado que no es un escenario que querrás / tengas que considerar, debería estar bien; ir para .toString().slice(7, -1); .

Una solución alternativa que podría considerar sería usar un símbolo global. Si va a pasar sus datos, y será necesario evitar colisiones de nombres de todos modos, este sería un caso de uso adecuado (suponiendo que no está escribiendo una biblioteca que se supone debe ser utilizada por terceros).

Tu usarías

const FOO = Symbol.for("foo"); // ^^^

y luego podría obtener el nombre del símbolo (que también es su descripción) de nuevo a través

Symbol.keyFor(FOO) // "foo"

Estoy trabajando en una aplicación ES6 que envía algunos de sus datos a través de la red. Parte de esto involucra identificadores que se implementan como Symbol ES6 s. Por ejemplo:

const FOO = Symbol(''foo'');

Llamar a Foo.toString() produce Symbol(foo) . Cuando los paso a través de la red, me gustaría pasarlo como solo foo . Sin embargo, que yo sepa, no hay forma de extraer foo de Symbol(foo) que no sea extraerlo con una expresión regular (específicamente, /^Symbol/((.*)/)$/ ).

¿Debo confiar en la expresión regular que siempre coincide? ¿O es posible que futuras actualizaciones de ES6 rompan esto? Si no puedo confiar en el ajuste de expresiones regulares, lo enviaré por el cable como Symbol(foo) .


Según la especificación , siempre es "Symbol(" + description + ")" .

Symbol.prototype.toString devuelve una cadena de una llamada de método interno a SymbolDescriptiveString(sym) :

Deje que desc sea ​​el valor de sym [[Description]] .
Si desc undefined está undefined , permita que desc sea ​​la cadena vacía.
[...]
Devuelve el resultado de concatenar las cadenas "Symbol(" , desc , and ")" .

Probablemente es mejor que uses

FOO.toString().slice(7, -1)

porque una descripción del símbolo podría contener paréntesis, saltos de línea, etc. en la expresión regular no coincidirá con los saltos de línea, por ejemplo.