Pendant le processus de rédaction du programme JavaScript, JS convertira automatiquement l'objet en numéro ou chaîne, puis le traitera en fonction de différents contextes. Les règles de cette conversion automatique sont les suivantes:
La règle pour convertir automatiquement l'objet en chaîne:
1. Si l'objet appartient à la classe remplace la méthode toString (), la méthode est appelée. Si le résultat de retour de l'appel toString () est primitif (chaîne, numéro, booléen, indéfini, null), la valeur primitive est convertie en chaîne et renvoyée.
2. Si la méthode toString () n'est pas remplacée par la classe toString (), le résultat de retour de l'appel toString () est "[objet objet]"; ou la méthode toString () est remplacée mais la méthode renvoie le résultat en tant qu'objet. Alors JS appellera la méthode de valeur de l'objet (). Si le résultat de retour de l'appel de valeur de () est primitif (chaîne, numéro, booléen, undefined, null), convertissez la valeur primitive en chaîne et retournez.
3. Si aucun des points ci-dessus n'est respecté et que la valeur primitive ne peut être obtenue en appelant la méthode ToString () de l'objet ou la méthode de valeur (), alors JS lancera une erreur de TypeError.
La règle pour convertir automatiquement l'objet en numéro:
1. Appelez la méthode d'objet de valeur de valeur (). Si la valeur primitive est obtenue, convertissez la valeur primitive en nombre et renvoyez-la.
2. Si la valeur primitive ne peut pas être obtenue à partir de la méthode de valeur de (), appelez la méthode toString () de l'objet; Si toString () renvoie une valeur primitive, convertissez la valeur primitive en nombre et retour.
3. Si aucun des deux points ci-dessus ne peut être rempli, JS lancera une erreur de type EERROR.
On peut voir que les règles de conversion automatiquement de l'objet en chaîne et objet en nombre sont en fait les mêmes. La différence est l'ordre de la méthode d'appel toString () et de la méthode de valeur de valeur ().
Selon les règles ci-dessus, certains résultats de conversion peuvent être bien compris:
1. Pour les tableaux vides, lors de la conversion en nombre, le résultat est 0. En effet, la valeur de la méthode du tableau sera appelée en premier. Puisque ValueOf () Renvoie l'objet Array lui-même, JS appellera ensuite la méthode toString () du tableau vide; Étant donné que le résultat du tableau vide toString () revient à une chaîne vide, la chaîne vide sera finalement convertie en nombre 0 et retournée.
2. Pour un tableau avec un seul membre du numéro, appliquez la même règle pour la convertir en un nombre, et le résultat final est le numéro.
3. Pour les tableaux avec plusieurs membres numériques, puisque la chaîne ne peut pas être convertie en nombre, le résultat final est NAN.
Quand se convertir en chaîne? Quand se convertir en numéro?
Lorsque vous effectuez une conversion de type automatique sur un objet, JS choisira de le convertir en chaîne ou numéro en fonction du type d'objet et de l'opérateur. Les règles spécifiques sont les suivantes:
1. Si un objet apparaît des deux côtés de l'opérateur +, convertissez l'objet en une chaîne.
2. Tous les objets (sauf les objets de date) seront d'abord convertis en numéro.
3. Pour les objets de date, la priorité est convertie en chaîne.
Il convient de noter que pour l'opérateur +, à l'exception du cas où les objets ou les chaînes apparaissent des deux côtés de l'opérateur, le fonctionnement de "converti en nombre" est effectué dans d'autres cas. Dans le même temps, cette opération est également liée à l'ordre entre les valeurs.
expérience
La copie de code est la suivante:
console.log (3 * []); // 0
console.log (3 * [2]); // 6
console.log (3 * [1,2]); // nan
console.log (3 + [2]); // 32
var now = new Date ();
console.log (maintenant + 1); // mer 26 mars 2014 10:51:39 GMT + 0800 (CST) 1
console.log (maintenant - 1); // 1395802299223
console.log (maintenant * 2); // 2791604598448
console.log (true + true); // 2
console.log (2 + null); // 2, null est converti en 0
Console.log (2 + Undefined); // nan, non défini est converti en nan
console.log (1 + 2 + "chats"); // 3 chats
console.log (1 + (2 + "chats")); // 12 chats