es6 - template string javascript
¿Cuál es el punto del tipo ''Símbolo'' en ECMA-262-v6? (1)
¿Cuál es el punto del tipo ''Símbolo'' en ECMA-262-v6? Implementación de ruta rápida para claves de objeto? ¿Qué hace bajo el capó? ¿Hasch con la garantía de que los datos subyacentes son inmutables?
Los símbolos son claves privadas que reemplazan nombres mágicos. Impiden usar una cadena simple para hacer referencia al campo, por lo que solo los consumidores con el símbolo pueden obtener acceso.
Algunos símbolos se utilizan para indicar comportamientos particulares en el tiempo de ejecución (como Symbol.iterator
, que actúa de manera muy similar a un secreto precompartido), mientras que otros pueden asignarse por la biblioteca y utilizarse para ocultar efectivamente los campos.
En general, los símbolos pretenden reemplazar a los nombres mágicos. En lugar de tener propiedades simplemente llamadas ''foo'', puede asignar un símbolo const foo = Symbol()
y pasarlo de forma selectiva. Esto permite que el tiempo de ejecución asigne Symbol.iterator
cuando se inicia y garantiza que cualquier persona que intente implementar un iterable lo haga de forma consistente.
El tiempo de ejecución podría usar símbolos para optimizar el acceso a ciertos campos, si sintiera la necesidad, pero no tiene que hacerlo.
Puede usar símbolos para dirigir a los consumidores a un método particular, según su uso. Por ejemplo, si tuviera una biblioteca que pudiera devolver un iterable sincrónico o un generador, dependiendo del soporte asíncrono del cliente, podría:
const syncIterable = Symbol();
const asyncIterable = Symbol();
class Foo {
static getIterable(async = false) {
return async ? asyncIterable : syncIterable;
}
[syncIterable]() {
return new SyncFoo();
}
[asyncIterable]() {
return new AsyncFoo();
}
}
let foo = new Foo();
for (let x of foo[Foo.getIterable(true)]()) {
// could be a iterator, could be a generator
}
Es un ejemplo bastante artificial, pero muestra cómo una biblioteca puede usar símbolos para brindar acceso selectivo a los usuarios.