Symbol.for (chaîne) dans ECMAScript 6

Cela m'a pris un moment, mais j'ai finalement compris quel est le but des symboles dans ECMAScript 6: éviter la collision de nom lors de l'attachement de propriétés à des objets partagés – éléments HTML par exemple (Si vous êtes coincé sur la même question, je recommande cet article . )

Mais alors je suis tombé sur Symbol.for () . Apparemment, ECMAScript 6 maintiendra un registre de symboles global que vous pouvez interroger avec cette fonction en fournissant la description du symbole. Revenez-vous? Si j'utilise des symboles pour éviter les collisions de noms, pourquoi voudrais-je un code autre que le mien pour les utiliser? (*) Et comment éviter les collisions de noms dans ce registre global? Le partage de symboles semble complètement subvertir le concept et un registre global doublement.

(*) Oui, je sais que les symboles ne sont pas vraiment privés, mais ça dépasse le but.

Si vous ne souhaitez pas que vos symboles soient disponibles dans GlobalSymbolRegistry, n'utilisez simplement Symbol.for .

Utilisez-le uniquement si vous souhaitez autoriser d'autres codes à utiliser votre symbole.

Dans l'exemple suivant, je crée un symbole pour stocker des données dans des éléments DOM. Et je pourrais vouloir tous les autres codes (p. Ex., Les gestionnaires non compilés non intégrés internes ) pour lire ces données. Donc, je rends le symbole mondialement disponible.

 var sym = Symbol.for('storeDataInDOM'); document.querySelector('button')[sym] = 'Hello, world!'; 
 <button onclick="alert(this[Symbol.for('storeDataInDOM')])">Click me</button> 

Si j'utilise des symboles pour éviter les collisions de noms, pourquoi voudrais-je un code autre que le mien pour les utiliser?

Ce n'est pas le seul cas d'utilisation de symboles. Les deux autres plus importants sont:

  • Ils n'interviennent pas avec les propriétés à clé à cordes
  • Ils ne sont pas énumérés par la mécanique habituelle

Le partage de symboles semble complètement subvertir le concept et un registre global doublement.

Pas nécessairement. À partir de cet article, vous lisez: « Le registre est utile lorsque plusieurs pages Web, ou plusieurs modules dans la même page Web, doivent partager un symbole. » Le meilleur exemple pour ces symboles intrinsèques: ils garantissent l' interopérabilité entre les domaines, c'est-à-dire Pourquoi le registre de symboles globaux est plus global que votre portée mondiale.

Par exemple, vous pourriez avoir une bibliothèque chargée dans une page Web, un iframe et un travailleur Web. Si vous partagez des données entre ces environnements (domaines), toutes les trois instances de votre bibliothèque voudraient utiliser le même symbole.

Il existe également un besoin réel d'interopérabilité entre les différentes bibliothèques, qui peuvent même ne pas se connaître. De bons exemples sont les transducteurs , les structures algébriques ou les promesses . L'ES6 serait-il déjà utilisé, tout cela aurait accepté des noms communs dans le registre des symboles globaux, au lieu de compter sur des chaînes comme celles – ci ou la méthode then .

Un autre bon exemple serait les crochets personnalisés définis par votre moteur, par exemple un Symbol.inspect = Symbol.for("inspect") que vous pouvez utiliser pour définir un comportement de chaîne de caractères personnalisé à utiliser par console.log . Certes, ce symbole n'a pas nécessairement besoin d'être mis à disposition via le registre des symboles globaux, il pourrait également être mis sur cet objet de bibliothèque spécifique (par ex. console.inspect = Symbole("console.inspect") ).

Et comment éviter les collisions de noms dans ce registre global?

Tout comme vous l'avez déjà fait avec des propriétés, ou des objets de modules globaux: en utilisant des noms très longs, très descriptifs, ou de bonne foi. En outre, il existe des conventions de nommage .