Conversion d'objet JavaScript en primitif

Il est maintenant temps de découvrir ce qui se passera si vous ajoutez des objets obj1 + obj2, soustrayez obj1 - obj2, ou affichez en utilisant alert(obj). Dans un tel cas, les objets seront automatiquement convertis en primitives, après quoi l'opération sera exécutée. Voici les principales règles pour les conversions numériques, de chaîne et booléennes des objets:

  • En général, les objets sont considérés comme true dans une conversion booléenne. Il y a simplement des conversions de chaîne et numériques.
  • Les conversions numériques ont lieu lors de la soustraction d'objets ou de l'application de fonctions mathématiques.
  • La conversion de chaîne se produit lorsque nous affichons un objet comme alert(obj) et dans des contextes similaires.

ToPrimitive

Il est possible d'améliorer la conversion de chaîne et numérique. Pour atteindre cet objectif, vous devez utiliser des méthodes d'objet uniques.

Nous observons trois variantes de conversion de type, également connues sous le nom d' “indications” qui sont décrites dans la spécification:

"string"

En cas de conversion objet-en-chaîne, tout en travaillant sur un objet qui attend une chaîne, comme alert:

// output
alert(obj);

// using object as a property key
anotherObj[obj] = 120;

"number"

En cas de conversion objet-en-nombre, comme lorsque vous faites des calculs:

// explicit conversion
let num = Number(obj);
// maths (except binary plus)
let n = +obj; // unary plus
let delta = obj1 - obj2;
// less/greater comparison
let greater = obj1 > obj2;

"default"

Cela se produit rarement, dans le cas où l'opérateur ne sait pas exactement quel type attendre. Par exemple, le binaire + fonctionnera avec des nombres et des chaînes. Si le binaire + a un objet comme argument, il utilisera le "default" pour le convertir.

Quand vous comparez un objet en utilisant == à un symbole, un nombre ou une chaîne, il n'est pas clair quelle conversion est préférable à faire. C'est pourquoi il est préférable d'utiliser l'indication "default".

// binary plus uses the "default" hint
let total = obj1 + obj2;

// obj == number uses the "default" hint
if (car == 1) { ...
};

Les opérateurs de comparaison supérieur et inférieur <, > fonctionnent également avec des nombres et des chaînes. Mais, notez que dans ce cas, l'indication "number" est utilisée, et non le "default", comme dans les exemples précédents.

Quoi qu'il en soit, en pratique, vous n'avez pas besoin de vous souvenir de tous ces détails, presque tous les objets intégrés (à l'exception de l'objet Date ).

Pour mettre en œuvre la conversion, JavaScript doit trouver et invoquer 3 méthodes d'objet. Elles sont les suivantes:

  • Appeler obj[Symbol.toPrimitive](hint) - une méthode incluant une clé symbolique Symbol.toPrimitive. S'il y a de telles méthodes,
  • Dans d'autres cas, lorsque l'indication est "string", continuer d'essayer obj.toString() et obj.valueOf().
  • Si l'indication est "default" ou "number", continuer d'essayer obj.valueOf() et obj.toString().

Symbol.toPrimitive

La première chose que vous devez savoir est qu'une méthode intégrée existe, connue sous le nom de Symbol.toPrimitive. En général, vous pouvez l'utiliser pour nommer votre méthode de conversion comme suit:

obj[Symbol.toPrimitive] = function (hint) {
  // must return a primitive value
  // hint = one of "string", "number", "default"
};

Dans l'exemple suivant, l'objet voiture l'applique:

Javascript object symbol convert to primitive
let car = { name: "BMW", price: 30000, [Symbol.toPrimitive](hint) { console.log(`hint: ${hint}`); return hint == "string" ? `{name: "${this.name}"}` : this.price; } }; // conversions demo: console.log(car); // hint: string -> {name: "BMW"} console.log(+car); // hint: number -> 30000 console.log(car + 5000); // hint: default -> 35000

toString/valueOf

Il est maintenant temps d'apprendre au sujet des méthodes toString et valueOf. Ne soyez pas surpris de découvrir qu'ils ne sont pas considérés comme des symboles. Ce sont parmi les méthodes les plus anciennes.

Le but principal de ces méthodes est de fournir une méthode "à l'ancienne" d'exécuter la conversion.

S'il n'existe pas de Symbol.toPrimitive JavaScript essaiera de les trouver dans la séquence suivante:

  1. toString -> valueOf dans le cas d'une indication “string”.
  2. valueOf -> toString dans les autres cas

Les méthodes mentionnées ci-dessus renverront une valeur primitive. Renvoyer un objet par valueOf ou toString signifie qu'il est ignoré.

Un objet comprend les méthodes toString et valueOf comme suit:

  • La méthode toString renvoie "[object Object]".
  • La méthode valueOf renverra l'objet lui-même.

Voyons ce cas:

Javascript object valueOf -> toString
let site = { name: "W3Docs" }; console.log(site); // [object Object] console.log(site.valueOf() === site); // true

Par conséquent, chaque fois que vous utilisez un objet comme une chaîne, vous aurez [object Object].

Les types de retour

Avant toute chose, vous devez noter que les méthodes de conversion primitive ne renvoient jamais le primitif qui a été indiqué. Vous ne pouvez pas contrôler si la méthode toString renvoie une chaîne ou si Symbol.toPrimitive renvoie un "number".

Une chose est obligatoire: les méthodes mentionnées ci-dessus doivent renvoyer une primitive et jamais un objet.

Conversions ultérieures

Vous avez déjà appris qu'un grand nombre d'opérateurs et de fonctions mettent en œuvre des conversions de type. Par exemple, une multiplication * convertira les opérandes en nombres.

Dans le cas où vous passez un objet comme argument, deux étapes peuvent être distinguées:

  • L'objet a été converti en primitif.
  • Si le primitif résultant n'est pas du type approprié, il est converti.

Voyons cet exemple:

Javascript object toString method
let obj = { //toString is capable of handling all conversions in the absence of different methods toString() { return "2"; } }; console.log(obj * 3); // 6, the object is converted to primitive "2", after which a number is made by multiplication

Ici, comme première étape, l'objet est converti en primitif par la multiplication obj * 3. Ensuite, "2" * 3 est transformé en 2 * 3.

Les chaînes seront concaténées dans la même condition par le plus binaire car il accepte une chaîne. Voici un exemple:

Javascript object toString method
let obj = { toString() { return "2"; } }; console.log(obj + 3); // 23 ("2" + 3), the object is converted to primitive returned a string => concatenation

Résumé

La conversion d'objet en primitif peut être invoquée automatiquement par une série de fonctions et d'opérateurs intégrés qui attendent une valeur primitive.

Il a les trois indications suivantes:

  1. "string" utilisé pour alert ainsi que d'autres opérations qui nécessitent une chaîne;
  2. "number" (utilisé pour les mathématiques)
  3. "default"( pas beaucoup d'opérateurs)

L'algorithme de la conversion est le suivant:

  1. Exécute obj[Symbol.toPrimitive](hint) si une telle méthode existe
  2. Dans les autres cas, lorsque l'indication est "string" . exécute obj.toString() et obj.valueOf(), quelle qu'elle existe
  3. Dans le cas où l'indication est "default"ou "number" . exécute obj.valueOf() et obj.toString(), quelle qu'elle existe.

Heure du Quiz : Testez Vos Compétences!

Prêt à relever le défi de ce que vous avez appris ? Plongez dans nos quiz interactifs pour approfondir votre compréhension et renforcer vos connaissances de manière ludique.

Trouvez-vous cela utile?