Skip to content

Commit f2a8ad1

Browse files
Improve object conversion algorithme explanation and apply minor fixes
1 parent e135813 commit f2a8ad1

File tree

1 file changed

+32
-35
lines changed
  • 1-js/04-object-basics/09-object-toprimitive

1 file changed

+32
-35
lines changed

1-js/04-object-basics/09-object-toprimitive/article.md

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
# Conversion d'objet en primitive
22

3-
Que se passe-t-il lorsque des objets sont ajoutés `obj1 + obj2`, soustraits `obj1 - obj2` ou imprimés à l'aide de `alert (obj)` ?
3+
Que se passe-t-il lorsque des objets sont ajoutés `obj1 + obj2`, soustraits `obj1 - obj2` ou affichés à l'aide de `alert(obj)` ?
44

55
JavaScript ne permet pas de personnaliser le fonctionnement des opérateurs sur les objets. Contrairement à certains autres langages de programmation, tels que Ruby ou C++, nous ne pouvons pas implémenter une méthode objet spéciale pour gérer un ajout (ou d'autres opérateurs).
66

77
Dans le cas de telles opérations, les objets sont auto-convertis en primitives, puis l'opération est effectuée sur ces primitives et aboutit à une valeur primitive.
88

99
C'est une limitation importante, car le résultat de `obj1 + obj2` (ou toute autre opération mathématique) ne peut pas être un autre objet !
1010

11-
Par exemple. nous ne pouvons pas créer d'objets représentant des vecteurs ou des matrices (ou des réalisations ou autre), les ajouter et s'attendre à un objet "sommé" comme résultat. De telles prouesses architecturales sont automatiquement "hors jeu".
11+
Par exemple nous ne pouvons pas créer d'objets représentant des vecteurs ou des matrices (ou des réalisations ou autre), les ajouter et s'attendre à un objet "sommé" comme résultat. De telles prouesses architecturales sont automatiquement "hors jeu".
1212

13-
Donc, parce que nous ne pouvons pas faire grand-chose ici, il n'y a pas de maths avec des objets dans de vrais projets. Lorsque cela se produit, c'est généralement à cause d'une erreur de codage.
13+
Donc, parce que nous ne pouvons pas faire grand-chose ici, il n'y a pas de maths avec des objets dans de vrais projets. Lorsque cela se produit, c'est généralement à cause d'une erreur de programmation.
1414

15-
Dans ce chapitre, nous verrons comment un objet se convertit en primitif et comment le personnaliser.
15+
Dans ce chapitre, nous verrons comment un objet se convertit en primitive et comment le personnaliser.
1616

1717
Nous avons deux objectifs :
1818

19-
1. Cela nous permettra de comprendre ce qui se passe en cas d'erreur de codage, lorsqu'une telle opération s'est produite accidentellement.
20-
2. Il existe des exceptions, où de telles opérations sont possibles et semblent bonnes. Par exemple. soustraire ou comparer des dates (objets `Date`). Nous les verrons plus tard.
19+
1. Cela nous permettra de comprendre ce qui se passe en cas d'erreur de programmation, lorsqu'une telle opération s'est produite accidentellement.
20+
2. Il existe des exceptions, où de telles opérations sont possibles et semblent bonnes. Par exemple, soustraire ou comparer des dates (objets `Date`). Nous les verrons plus tard.
2121

2222
## Règles de conversion
2323

24-
Dans le chapitre <info:type-conversions> nous avons vu les règles pour les conversions numériques, chaînes et booléennes de primitives. Mais nous avions mis de côté les objets. Maintenant que nous connaissons les méthodes et les symboles, il devient possible de l'aborder.
24+
Dans le chapitre <info:type-conversions> nous avons vu les règles de conversion des types primitifs numériques, chaînes de caractères et booléens. Mais nous avions mis de côté les objets. Maintenant que nous connaissons les méthodes et les symboles, il devient possible de l'aborder.
2525

2626
1. Il n'y a pas de conversion en booléen. Tous les objets sont "true" dans un contexte booléen, aussi simple que cela. Il n'existe que des conversions numériques et de chaînes de caractères.
2727
2. La conversion numérique se produit lorsque nous soustrayons des objets ou appliquons des fonctions mathématiques. Par exemple, les objets `Date` (à traiter dans le chapitre <info:date>) peut être soustrait et le résultat de `date1 - date2` est la différence de temps entre deux dates.
28-
3. En ce qui concerne la conversion de chaîne de caractères - cela se produit généralement lorsque nous affichons un objet tel que `alert (obj)` et dans des contextes similaires.
28+
3. En ce qui concerne la conversion de chaîne de caractères, cela se produit généralement lorsque nous affichons un objet tel que `alert(obj)` et dans des contextes similaires.
2929

3030
Nous pouvons implémenter nous-mêmes la conversion de chaînes de caractères et de chiffres, en utilisant des méthodes d'objet spéciales.
3131

@@ -35,7 +35,7 @@ Passons maintenant aux détails techniques, car c'est le seul moyen d'aborder le
3535

3636
Comment JavaScript décide-t-il quelle conversion appliquer ?
3737

38-
Il existe trois variantes de conversion de type, qui se produisent dans diverses situations. Ils sont appelés "hints", comme décrit dans la [spécification](https://tc39.github.io/ecma262/#sec-toprimitive) :
38+
Il existe trois variantes de conversion de type, qui se produisent dans diverses situations. Ils sont appelés "hints" (indices), comme décrit dans la [spécification](https://tc39.github.io/ecma262/#sec-toprimitive) :
3939

4040
Il existe trois variantes de conversion de type, appelées "hints", décrites dans la [specification](https://tc39.github.io/ecma262/#sec-toprimitive) :
4141

@@ -67,24 +67,25 @@ let delta = date1 - date2;
6767
let greater = user1 > user2;
6868
```
6969

70-
Most built-in mathematical functions also include such conversion.
70+
La plupart des fonctions mathématiques intégrées comprennent également ce type de conversion.
7171

72-
`"default"`
73-
: Se produit dans de rares cas où l'opérateur n'est "pas sûr" du type auquel il doit s'attendre.
72+
**`"default"`**
7473

75-
Par exemple, le binaire plus `+` peut fonctionner à la fois avec des chaînes de caractères (les concaténer) et des nombres (les ajouter). Donc, si le plus binaire obtient un objet sous forme d'argument, il utilise le hint `"default"` pour le convertir.
74+
Se produit dans de rares cas où l'opérateur n'est "pas sûr" du type auquel il doit s'attendre.
7675

77-
En outre, si un objet est comparé à l'aide de `==` avec une chaîne de caractères, un nombre ou un symbole, il est également difficile de savoir quelle conversion doit être effectuée, par conséquent l'indicateur `"default"` est utilisé.
76+
Par exemple, le plus binaire `+` peut fonctionner à la fois avec des chaînes de caractères (les concaténer) et des nombres (les ajouter). Donc, si le plus binaire obtient un objet sous forme d'argument, il utilise le hint `"default"` pour le convertir.
7877

79-
```js
80-
// binary plus uses the "default" hint
81-
let total = obj1 + obj2;
78+
En outre, si un objet est comparé à l'aide de `==` avec une chaîne de caractères, un nombre ou un symbole, il est également difficile de savoir quelle conversion doit être effectuée, par conséquent l'indicateur `"default"` est utilisé.
8279

83-
// obj == number uses the "default" hint
84-
if (user == 1) { ... };
85-
```
80+
```js
81+
// binary plus uses the "default" hint
82+
let total = obj1 + obj2;
83+
84+
// obj == number uses the "default" hint
85+
if (user == 1) { ... };
86+
```
8687

87-
Les opérateurs de comparaison supérieurs et inférieurs, tels que `<` `>`, peuvent également fonctionner avec des chaînes de caractères et des nombres. Néanmoins, ils utilisent l'indicateur `"number"`, pas `default`. C'est pour des raisons historiques,
88+
Les opérateurs de comparaison supérieurs et inférieurs, tels que `<` et `>`, peuvent également fonctionner avec des chaînes de caractères et des nombres. Néanmoins, ils utilisent l'indicateur `"number"`, pas `default`. C'est pour des raisons historiques.
8889

8990
En pratique cependant, les choses sont un peu plus simples.
9091

@@ -94,11 +95,9 @@ Pourtant, il est important de connaître les 3 hints, nous verrons bientôt pour
9495

9596
**Pour effectuer la conversion, JavaScript essaie de trouver et d'appeler trois méthodes d'objet :**
9697

97-
1. Appeler `obj[Symbol.toPrimitive](hint)` - la méthode avec la clé symbolique `Symbol.toPrimitive` (symbole système), si une telle méthode existe,
98-
2. Sinon, si l'indice est `"string"`
99-
- essaie d'appeler `obj.toString()` et `obj.valueOf()`, tout ce qui existe.
100-
3. Sinon, si l'indice est `"number"` ou `"default"`
101-
- essaie d'appeler `obj.valueOf()` et `obj.toString()`, tout ce qui existe.
98+
1. Appeler la méthode `obj[Symbol.toPrimitive](hint)` avec la clé symbolique `Symbol.toPrimitive` (symbole système), si une telle méthode existe.
99+
2. Sinon, si l'indice est `"string"`, essaie d'appeler `obj.toString()` puis `obj.valueOf()`, selon ce qui existe.
100+
3. Sinon, si l'indice est `"number"` ou `"default"`, essaie d'appeler `obj.valueOf()` puis `obj.toString()`, selon ce qui existe.
102101

103102
## Symbol.toPrimitive
104103

@@ -108,7 +107,7 @@ Commençons par la première méthode. Il existe un symbole intégré appelé `S
108107
obj[Symbol.toPrimitive] = function(hint) {
109108
// voici le code pour convertir cet objet en une primitive
110109
// il doit retourner une valeur primitive
111-
// hint = un de "string", "number", "default"
110+
// hint = "string" ou "number" ou "default"
112111
};
113112
```
114113

@@ -213,7 +212,7 @@ En l'absence de `Symbol.toPrimitive` et de `valueOf`, `toString` gérera toutes
213212

214213
La chose importante à savoir sur toutes les méthodes de conversion de primitives est qu'elles ne renvoient pas nécessairement la primitive "hinted".
215214

216-
Il n'y a pas de control pour vérifier si `ToString()` renvoie exactement une chaîne de caractères ou si la méthode `Symbol.toPrimitive` renvoie un nombre pour le hint `"number"`.
215+
Il n'y a pas de control pour vérifier si `toString` renvoie exactement une chaîne de caractères ou si la méthode `Symbol.toPrimitive` renvoie un nombre pour le hint `"number"`.
217216

218217
**La seule chose obligatoire : ces méthodes doivent renvoyer une primitive, pas un objet.**
219218

@@ -248,7 +247,7 @@ alert(obj * 2); // 4, objet converti en primitive "2", puis la multiplication le
248247
1. La multiplication `obj * 2` convertit d'abord l'objet en primitive (cela devient une chaîne de caractère `"2"`).
249248
2. Ensuite `"2" * 2` devient `2 * 2` (la chaîne de caractères est convertie en nombre).
250249

251-
Le binaire plus va concaténer des chaînes de caractères dans la même situation, car il accepte volontiers une chaîne de caractères :
250+
Le plus binaire `+` va concaténer des chaînes de caractères dans la même situation, car il accepte volontiers une chaîne de caractères :
252251

253252
```js run
254253
let obj = {
@@ -268,17 +267,15 @@ Il en existe 3 types (hints) :
268267

269268
- `"string"` (pour `alert` et d'autres opérations qui nécessitent une chaîne de caractères)
270269
- `"number"` (pour des maths)
271-
- `"default"` (peu d'opérateurs, généralement des objets l'implémentent de la même manière que `"number"`)
270+
- `"default"` (peu d'opérateurs, généralement les objets l'implémentent de la même manière que `"number"`)
272271

273-
La spécification décrit explicitement quel opérateur utilise quel conseil.
272+
La spécification décrit explicitement quel opérateur utilise quel hint.
274273

275274
L'algorithme de conversion est :
276275

277276
1. Appeler `obj[Symbol.toPrimitive](hint)` si la méthode existe,
278-
2. Sinon, si l'indice est `"string"`
279-
- essaie `obj.toString()` et `obj.valueOf()`, tout ce qui existe.
280-
3. Sinon, si l'indice est `"number"` ou `"default"`
281-
- essaie `obj.valueOf()` et `obj.toString()`, tout ce qui existe.
277+
2. Sinon, si l'indice est `"string"`, essaie `obj.toString()` puis `obj.valueOf()`, selon ce qui existe.
278+
3. Sinon, si l'indice est `"number"` ou `"default"`, essaie `obj.valueOf()` puis `obj.toString()`, selon ce qui existe.
282279

283280
Toutes ces méthodes doivent renvoyer une primitive pour fonctionner (si elle est définie).
284281

0 commit comments

Comments
 (0)