Les variables ECMAScript contiennent des valeurs de deux types de données différents : les valeurs de type de base et les valeurs de type de référence. Les valeurs de type primitif sont de simples éléments de données, tandis que les valeurs de type référence sont des objets qui peuvent être composés de plusieurs valeurs.
Lors de l'attribution d'une valeur à une variable, l'analyseur doit déterminer si la valeur est un type primitif ou un type référence. Les types de base incluent Indéfini, Null, Booléen, Nombre et Chaîne. Ces cinq types de données de base sont accessibles par valeur, de sorte que la valeur réelle stockée dans la variable peut être manipulée ; la valeur du type de référence est stockée dans l'objet mémoire. Contrairement à d’autres langages, JavaScript ne permet pas d’accéder directement aux emplacements en mémoire, ce qui signifie que l’espace mémoire d’un objet ne peut pas être directement manipulé. Lorsque vous opérez sur un objet, vous opérez en fait sur une référence à l'objet plutôt que sur l'objet réel, de sorte que la valeur d'un type référence est accessible par référence.
1. Attributs dynamiques
Les méthodes de définition des types de base et de définition des types de référence sont très similaires. Pour les valeurs de type référence, nous pouvons leur ajouter des propriétés et des méthodes, et nous pouvons également modifier et supprimer leurs propriétés et méthodes, comme suit :
2. Copier la valeur de la variable
Si vous copiez une valeur d'un type de base d'une variable à une autre, une nouvelle valeur est créée sur l'objet variable puis copiée à l'emplacement alloué à la nouvelle variable.
Lorsqu'une valeur de type référence est copiée d'une variable vers une autre variable, une copie de la valeur stockée dans l'objet variable sera également copiée dans l'espace mémoire alloué à la nouvelle variable. La différence est que cette valeur est en réalité un pointeur vers un objet stocké dans le tas. Une fois la copie terminée, les deux variables feront en réalité référence au même objet. Par conséquent, changer l’une des variables affectera l’autre variable, comme indiqué ci-dessous :
3. Paramètres de réussite
Les paramètres de toutes les fonctions dans ESMAScript sont transmis par valeur. En d’autres termes, copier la valeur en dehors de la fonction vers le paramètre à l’intérieur de la fonction revient à copier la valeur d’une variable à une autre. Les valeurs de type primitif sont transmises tout comme les variables de type primitif sont copiées. Le transfert des valeurs de type référence est identique à la copie des variables de type référence. De nombreux développeurs peuvent être confus à ce stade, car il existe deux manières d'accéder aux variables, par valeur et par référence, alors que les paramètres ne peuvent être transmis que par valeur.
Lors du passage d'une valeur de type de base à un paramètre, la valeur transmise sera copiée dans une variable locale (paramètre nommé). Comme indiqué dans le code suivant :
Lors du passage d'une valeur de type référence à un paramètre, l'adresse de la valeur en mémoire sera copiée dans une variable locale, donc les modifications apportées à cette variable locale seront reflétées en dehors de la fonction. Ici, nous utilisons des types de référence pour jeter un œil :
Dans cette fonction, obj et person font référence au même objet. En d'autres termes, même si l'objet est passé par valeur, obj accédera au même objet par référence. Par conséquent, lorsque l'attribut name est ajouté à obj à l'intérieur de la fonction, la personne en dehors de la fonction sera également reflétée, car il n'y a qu'un seul objet pointé par la personne dans la mémoire du tas, et c'est un objet global. De nombreux développeurs croient à tort que les objets modifiés dans la portée locale seront reflétés dans la portée globale, ce qui signifie que les paramètres sont transmis par référence. Pour prouver que les objets sont passés par valeur, regardons l'exemple modifié suivant :
Comme le montre l'exemple ci-dessus, si la personne est passée par référence, alors la personne sera automatiquement modifiée pour pointer vers un nouvel objet dont la valeur de l'attribut name est "sdf". Cependant, lors de l'accès suivant à person.name, "zxj" est toujours affiché. Cela montre que même si la valeur du paramètre est modifiée à l'intérieur de la fonction, la référence d'origine reste inchangée. En fait, lorsque obj est remplacé dans une fonction, cette variable fait référence à un objet local. Cet objet local sera détruit immédiatement lorsque la fonction aura terminé son exécution.
Considérez les paramètres des fonctions ECMAScript comme des variables locales.
4.Type de détection
Bien que typeof soit un assistant puissant lors de la détection des types de données de base, cet opérateur n'est pas très utile lors de la détection des types de référence. Habituellement, nous ne voulons pas savoir si une valeur est un objet, mais de quel type d'objet il s'agit. ECMAScript fournit à cet effet l'opérateur instanceof, dont la syntaxe est la suivante :