Symbol
est un type spécial en JavaScript
. En particulier, toutes les valeurs du type Symbol
sont différentes les unes des autres. Nous pouvons utiliser "Symbol" pour représenter une valeur unique. Voici un exemple de création d'un objet Symbol
:
let id = Symbol();
De cette façon, nous créons une valeur de type Symbol
et stockons cette valeur dans la variable id
.
Lorsque nous créons une variable de type Symbol
, nous pouvons transmettre des chaînes avec des attributs seconds dans les paramètres pour décrire les informations sur le but de cette variable.
Par exemple :
let id1 = Symbol('L'identifiant de Xiao Ming qui est fou et cool'); let id2 = Symbol('Id de Tingting discret, luxueux et connotatif');
Les types Symbol
sont différents à tout moment, même s'ils ont les mêmes informations de description, la description n'est qu'une étiquette et n'a aucun autre but Par exemple :
let id1 = Symbole('id'); laissez id2 = Symbole('id'); console.log(id1==id2);//
La signification de la fausse étiquette, je pense personnellement qu'elle est liée au fait que Symbol
ne peut pas voir intuitivement la valeur spécifique interne. En ajoutant une information de description, nous pouvons avoir une vision plus intuitive. compréhension de l’utilisation des variables.
La plupart des types en JavaScript
peuvent être directement convertis en type chaîne pour la sortie, nous ne pouvons donc pas voir intuitivement quelle est sa valeur. Par exemple, nous pouvons directement utiliser alert(123)
pour convertir le nombre 123
Convertir en fenêtre contextuelle de chaîne.
Cependant, le type Symbol
est spécial et ne peut pas être converti directement, par exemple :
let id = Symbol(); alert(id);//Rapport d'erreur, le type Symbol ne peut pas être converti
en chaîne. Symbol
en JavaScript
ne peut pas être converti en chaîne en raison de son mécanisme inhérent de « protection du langage » pour éviter toute confusion de langage, car les chaînes et Symbol
sont essentiellement différent Il y a une différence et l’une ne doit pas être transformée en l’autre.
Imaginez simplement que si Symbol
peut être converti en chaîne, il devient alors une fonction qui génère une chaîne unique et il n'est pas nécessaire d'avoir un type de données indépendant.
Si nous voulons vraiment connaître la valeur de Symbol
, nous pouvons utiliser la méthode .toString()
comme suit :
let id = Symbol('this is identification'); console.log(id.toString());//Symbol(c'est une identification);
Ou utilisez l'attribut .description
pour obtenir les informations de description :
let id = Symbol('Allez, donne-moi Oli'); console.log(id.description);//Allez, Ollie”
Selon les spécifications JavaScript
, seuls deux types de valeurs peuvent être utilisés comme clés de propriété d'objet :
If
.d'autres types sont utilisés, elle sera implicitement convertie en type chaîne. La clé de l'objet est présentée en détail dans le chapitre précédent et ne sera pas répétée ici.
Il existe deux Symbol
Exemple 1 :
let id = Symbol('id'); laissez l'utilisateur = {} ; user[id] = 'id value';//Ajouter une clé de symbole console.log(user[id]);//id value
Exemple 2 :
let id = Symbol('id'); laissez l'utilisateur = { [id] : 'id value', // notez les crochets ici } ; console.log(user[id]);
Les deux cas ci-dessus montrent l'utilisation de l'insertion Symbol
comme clé dans l'objet. Il convient de noter que lors de l'accès à l'attribut, vous devez utiliser obj[id]
au lieu de obj.id
, car obj.id
représente obj['id']
.
Que se passera-t-il si nous utilisons Symbol
comme clé de l'objet ?
Symbol
for...in est que si l'objet utilise Symbol
comme clé, alors Symbol
ne sont pas accessibles à l'aide for…in
.
Par exemple :
let id = Symbol('id'); laissez l'utilisateur = { nom : 'xiaoming', [je l'ai fait', } ; for (let key in user) console.log(user[key]);
Exécutez le code ci-dessus et obtenez les résultats suivants :
> Xiaoming
peut constater que la valeur de l'objet [id]
n'est pas imprimée, indiquant que dans l'objet liste d'attributs, utiliser for … in
ignorera automatiquement les clés de type Symbol
.
De même, Object.keys(user)
ignorera toutes les clés de type Symbol
.
Cette fonctionnalité peut apporter des effets très utiles, par exemple nous pouvons créer des propriétés que nous seuls pouvons utiliser.
Bien que nous n'ayons aucun moyen d'obtenir directement la clé Symbol
, Object.assign
peut copier toutes les propriétés :
let id = Symbol(); soit obj = { [identifiant] : '123' } laissez obj2 = Objet.assign({},obj); console.log(obj2[id]);
Cela n'affecte pas les propriétés cachées de Symbol
, car l'objet copié ne peut toujours pas obtenir la clé Symbol
.
Puisque Symbol
ne peut pas être directement converti en chaîne, nous n'avons aucun moyen d'obtenir sa valeur intuitivement, ni l'attribut Symbol
de l'objet via for … in
En d'autres termes, sans Symbol
elle-même, nous n'avons aucun moyen d'obtenir les propriétés correspondantes à l'intérieur de l'objet.
Par conséquent, grâce à la valeur clé du type Symbol
, nous pouvons masquer les propriétés. Ces propriétés ne sont accessibles que par nous-mêmes et personne d'autre ne peut voir nos propriétés.
Par exemple :
pendant le processus de développement, nous devons coopérer avec notre collègue « Zhang San », et Zhang San a créé un Tool
très facile à utiliser. Tool
L' Tool
est un type d'objet que nous voulons utiliser gratuitement. , et ajoutez certaines de vos propres propriétés en fonction de cela.
On peut ajouter une clé de type Symbol
:
let tool = {//Tool écrit par Zhang San utilisation : "Peut tout faire", } let name = Symbol("Mon outil obj"); outil[nom] = "Ceci est mon outil" ; console.log(tool[name]);
L'exemple ci-dessus montre comment ajouter vos propres propriétés à un objet écrit par d'autres, alors pourquoi utiliser Symbol
au lieu d'une chaîne normale ?
Les raisons sont les suivantes :
tool
, car cela entraînerait des risques ;Symbol
, car Symbol
sont différents ;Symbol
, ce qui signifie qu'ils n'entreront pas en conflit avec le code d'autres personnes ;
Si nous n'utilisons pas le type Symbol
, la situation suivante est susceptible de se produire :
let tool = {//Tool écrit par Zhang San utilisation : "Peut tout faire", } outil.usage = "Boum Boum" ; console.log(tool.usage);
Le code ci-dessus réutilise "usage" et réécrit ainsi les attributs d'origine, ce qui rendra la fonction d'origine de l'objet anormale.
Toutes les variables Symbol
sont différentes, même si elles ont la même étiquette (description).
Parfois, nous souhaitons accéder au même objet Symbol
via un nom de chaîne (étiquette), par exemple, nous accédons au même Symbol
à différents endroits du code.
JavaScript
maintient un registre global Symbol
. Nous pouvons accéder à l'objet en insérant un objet Symbol
dans le registre et en donnant à l'objet un nom de chaîne.
Pour insérer ou lire un objet Symbol
dans le registre, vous devez utiliser Symbol.for(key)
S'il existe un objet nommé key
dans le registre, l'objet sera renvoyé. Sinon, un nouvel objet sera inséré et. est revenu.
Par exemple :
let id1 = Symbol.for('id');//Il n'y a pas de symbole nommé id dans le registre, créez et retournez let id2 = Symbol.for('id');//Il existe déjà un symbole nommé id dans le registre Pour le Symbol avec id, renvoyez directement console.log(id1===id2);//true.
Grâce à Symbol.for(key)
nous pouvons utiliser Symbol
comme variable globale et utiliser une chaîne pour marquez le nom de l’objet.
Au contraire, nous pouvons également utiliser Symbol.keyFor(Symbol)
pour obtenir le nom de l'objet à l'envers.
Par exemple :
let id = Symbol.for('id');//Il n'y a aucun symbole nommé id dans le registre, créez et retournez let name = Symbol.keyFor(id);La fonction
console.log(name);//id
Symbol.keyFor()
ne peut être utilisée que sur des objets Symbol
globaux (objets insérés à l'aide de Symbol.for
). Si elle est utilisée sur des objets non globaux, elle renverra undefined
.
Par exemple :
let id = Symbol('id');//local Symbol let name = Symbol.keyFor(id); console.log(name);//undefined
JavaScript
a de nombreux systèmes Symbol
,Par exemple:
Symbol.hasInstance
Symbol.iterator
Symbol.toPrimitive
.Ils ont leurs propres utilisations.Nous présenterons progressivement ces variables uniques plus tard.
Symbol
est unique ;Symbol
l'objet dans le registre global via l'étiquetteSymbol
la clé de l'objet ne peut pas être détectée for … in
;Symbol
L'objet Symbol
global ;cependant, Symbol
n'est pas complètement caché. Nous pouvons obtenir tous Symbol
de l'objet via Object.getOwnPropertySymbols(obj)
, ou obtenir toutes les clés de l'objet via Reflect.ownKeys(obj)
.