10
votes

Symbole.for (string) dans ECMAScript 6


4 commentaires

Comme il est incertain de votre question, faire symbole ("une description"); n'enregistre pas les choses dans le registre mondial. Ce n'est que si vous demandez explicitement un symbole enregistré globalement via symbole.for .


Oui, merci pour la clarification!


L'auteur: Hacks.Mozilla.org/2015/06/es6-in-depth-symbols/Comment-Page- 1 / ...


Ce n'est pas une grande partie d'un exemple cependant. Simplement indiquant que le code peut avoir la nécessité d'accéder aux propriétés entre les bibliothèques et / ou les iframes, ne montre que pourquoi un registre de symboles est la solution.


3 Réponses :


11
votes

Si vous ne voulez pas que vos symboles soient disponibles dans GlobalSyMbolBolReMerRistristry, n'utilisez tout simplement pas le symbole .for code>.

Utilisez uniquement si vous souhaitez autoriser d'autres codes à utiliser votre symbole. . P>

Dans l'exemple suivant, je crée un symbole pour stocker des données dans les éléments DOM. Et je souhaite peut-être tous les autres code (par exemple, manuels internes RAW non pondérés ) lire ces données. Donc, je fais le symbole à l'échelle mondiale. P>

p>

<button onclick="alert(this[Symbol.for('storeDataInDOM')])">Click me</button>


5 commentaires

La question est plutôt: pourquoi voudrais-je partager mes symboles?


@Petercoester J'ai ajouté un exemple. Mais la question est la suivante: pourquoi pas? ES6 fournit un moyen de le faire, l'utiliser si vous êtes intéressé ou l'ignorer autrement.


Mais le partage des symboles ne crée pas les mêmes symboles de problèmes ont été créés pour résoudre? Votre exemple ne montre pas exactement un cas d'utilisation pour le partage de symboles.


@Petercoester Oui, il y a un risque de collision. Mais les variables mondiales ont le même problème et les personnes les utilisent de toute façon. Et dans mon exemple: comment accéderiez-vous à un symbole dans un gestionnaire interne indispilé cru? L'introduction d'un globalBolbolBolBolBoly permet de le faire sans polluer l'objet global.


Hm. Oui, je pense que je peux voir un tas d'usages d'usage maintenant ... Les symboles peuvent être utilisés comme le .data ( ) fonctionne dans jQuery et vous pouvez attacher et manipuler des contrôles d'interface utilisateur de cette façon, par exemple, par exemple Merci! Cela a aidé. J'ai évoqué votre réponse.



5
votes

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

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

  • Ils ne sont pas entrés en collision avec des propriétés à cordes de cordes
  • ils ne sont pas énumérés par la mécanique habituelle

    Le partage des symboles semble totalement subvertir le concept et un registre global doublement.

    Pas nécessairement. Juste de Cet article vous lisez: " Le registre est utile lorsque plusieurs pages Web ou plusieurs modules de la même page Web doivent partager un symbole. "Le meilleur exemple pour ce sont les symboles intrinsèques - ils garantissent interopérabilité à travers royaumes, c'est pourquoi le Le registre des symboles globaux est plus global que votre portée globale.

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

    Il y a également une réelle interopérabilité entre différentes bibliothèques, ce qui pourrait même ne pas savoir les uns des autres. Les bons exemples sont transducteurs , Structures algébriques ou promesses . ES6 serait déjà utilisé, tout cela aurait convenu de noms communs dans le registre des symboles mondiaux, au lieu de s'appuyer sur des cordes comme ces ou le puis méthode.

    Un autre bon exemple serait des crochets personnalisés définis par votre moteur, par exemple A symbole.Inspect = symbole.for ("Inspecter") que vous pouvez utiliser pour définir le comportement de stringification 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 exemple, console.inspect = symbole ("Console.Inspect") ).

    et comment éviter de nommer les collisions dans ce registre mondial?

    Tout comme vous avez déjà fait avec des propriétés ou des objets de module globaux: en utilisant des noms très longs et très descriptifs - ou de bonne foi. Il y a aussi quelques conventions de dénomination .


0 commentaires

0
votes

J'ai inventé la caractéristique la plus utile de symbole.for () appel. Si vous utilisez des symboles dans votre code, il est parfois difficile d'utiliser points d'arrêt conditionnel tout en débogage. Par exemple, vous devez attraper si la variable est égale à la valeur qui est de type de symbole et de cette valeur liée dans le module différent. La première solution difficile est d'utiliser cette valeur comme une constante et d'exporter à partir de ce module. Dans ce cas, la condition du point d'arrêt regardera: xxx

mais le moyen le plus simple consiste à modifier temporairement le code dans le module ajoutant .pour à à Symbole . Ensuite, vous pouvez écrire la condition: xxx

Après la réussite du débogage, vous modifierez le code de replacement simplement enlever .pour partie.


0 commentaires