Quel est le point du type 'Symbol' dans ECMA-262-v6?

Quel est le point du type 'Symbol' dans ECMA-262-v6? Implémentation de chemin rapide pour les clés d'objet? Que fait-il sous le capot - le faire avec la garantie que les données sous-jacentes sont immuables?

0
ajouté l'auteur Bergi, source
ajouté l'auteur Bergi, source

1 Réponses

Les symboles sont des clés privées qui remplacent les noms magiques. Ils empêchent d'utiliser une chaîne simple pour référencer le champ, de sorte que seuls les consommateurs avec le symbole peuvent y accéder.

Certains symboles sont utilisés pour indiquer des comportements particuliers à l'exécution (comme Symbol.iterator , qui agit comme un secret pré-partagé), tandis que d'autres peuvent être alloués par la bibliothèque et utilisés pour masquer efficacement les champs.

En général, les symboles sont destinés à remplacer les noms magiques. Plutôt que d'avoir une propriété appelée simplement 'foo', vous pouvez allouer un symbole const foo = Symbol() et le passer sélectivement. Cela permet au moteur d'exécution d'allouer Symbol.iterator au démarrage et garantit que tout utilisateur essayant d'implémenter un iterable le fait de manière cohérente.

Le moteur d'exécution peut utiliser des symboles pour optimiser l'accès à certains champs, s'il en a besoin, mais il n'est pas obligé de le faire.

Vous pouvez utiliser des symboles pour diriger les consommateurs vers une méthode particulière, en fonction de leur utilisation. Par exemple, si vous avez une bibliothèque qui peut renvoyer une itération synchrone ou un générateur, en fonction de la prise en charge asynchrone du client, vous pouvez:

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
}

C'est un exemple plutôt artificiel, mais montre comment une bibliothèque peut utiliser des symboles pour fournir un accès sélectif aux utilisateurs.

0
ajouté
"Les symboles sont des clés privées qui remplacent les noms magiques." Non, les symboles ne sont pas du tout privés. Pas même un peu. "... de sorte que seuls les consommateurs avec le symbole peuvent accéder" Mais tout le monde peut obtenir le symbole, donc cela n'a pas de sens: tc39.github.io/ecma262/#sec-object.getownpropertysymbols
ajouté l'auteur T.J. Crowder, source