You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/09-object-toprimitive/article.md
+32-35Lines changed: 32 additions & 35 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,31 +1,31 @@
1
1
# Conversion d'objet en primitive
2
2
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)` ?
4
4
5
5
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).
6
6
7
7
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.
8
8
9
9
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 !
10
10
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".
12
12
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.
14
14
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.
16
16
17
17
Nous avons deux objectifs :
18
18
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.
21
21
22
22
## Règles de conversion
23
23
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.
25
25
26
26
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.
27
27
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.
29
29
30
30
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.
31
31
@@ -35,7 +35,7 @@ Passons maintenant aux détails techniques, car c'est le seul moyen d'aborder le
35
35
36
36
Comment JavaScript décide-t-il quelle conversion appliquer ?
37
37
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) :
39
39
40
40
Il existe trois variantes de conversion de type, appelées "hints", décrites dans la [specification](https://tc39.github.io/ecma262/#sec-toprimitive) :
41
41
@@ -67,24 +67,25 @@ let delta = date1 - date2;
67
67
let greater = user1 > user2;
68
68
```
69
69
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.
71
71
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"`**
74
73
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.
76
75
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.
78
77
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é.
82
79
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
+
```
86
87
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.
88
89
89
90
En pratique cependant, les choses sont un peu plus simples.
90
91
@@ -94,11 +95,9 @@ Pourtant, il est important de connaître les 3 hints, nous verrons bientôt pour
94
95
95
96
**Pour effectuer la conversion, JavaScript essaie de trouver et d'appeler trois méthodes d'objet :**
96
97
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.
102
101
103
102
## Symbol.toPrimitive
104
103
@@ -108,7 +107,7 @@ Commençons par la première méthode. Il existe un symbole intégré appelé `S
108
107
obj[Symbol.toPrimitive] =function(hint) {
109
108
// voici le code pour convertir cet objet en une primitive
110
109
// il doit retourner une valeur primitive
111
-
// hint = un de "string", "number", "default"
110
+
// hint = "string" ou "number" ou "default"
112
111
};
113
112
```
114
113
@@ -213,7 +212,7 @@ En l'absence de `Symbol.toPrimitive` et de `valueOf`, `toString` gérera toutes
213
212
214
213
La chose importante à savoir sur toutes les méthodes de conversion de primitives est qu'elles ne renvoient pas nécessairement la primitive "hinted".
215
214
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"`.
217
216
218
217
**La seule chose obligatoire : ces méthodes doivent renvoyer une primitive, pas un objet.**
219
218
@@ -248,7 +247,7 @@ alert(obj * 2); // 4, objet converti en primitive "2", puis la multiplication le
248
247
1. La multiplication `obj * 2` convertit d'abord l'objet en primitive (cela devient une chaîne de caractère `"2"`).
249
248
2. Ensuite `"2" * 2` devient `2 * 2` (la chaîne de caractères est convertie en nombre).
250
249
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 :
252
251
253
252
```js run
254
253
let obj = {
@@ -268,17 +267,15 @@ Il en existe 3 types (hints) :
268
267
269
268
-`"string"` (pour `alert` et d'autres opérations qui nécessitent une chaîne de caractères)
270
269
-`"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"`)
272
271
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.
274
273
275
274
L'algorithme de conversion est :
276
275
277
276
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.
282
279
283
280
Toutes ces méthodes doivent renvoyer une primitive pour fonctionner (si elle est définie).
0 commit comments