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
Que se passe-t-il lorsque des objets sont ajoutés `obj1 + obj2`, soustraits `obj1 - obj2` ou imprimés à l'aide de `alert (obj)` ?
5
5
6
-
<<<<<<< HEAD
7
-
JavaScript ne permet pas exactement 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).
8
-
=======
9
-
JavaScript doesn't allow you to customize how operators work on objects. Unlike some other programming languages, such as Ruby or C++, we can't implement a special object method to handle addition (or other operators).
10
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
6
+
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).
11
7
12
8
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.
13
9
14
-
<<<<<<< HEAD
15
-
C'est une limitation importante, car le résultat de `obj1 + obj2` ne peut pas être un autre objet !
16
-
=======
17
-
That's an important limitation: the result of `obj1 + obj2` (or another math operation) can't be another object!
18
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
10
+
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 !
19
11
20
12
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".
21
13
22
-
<<<<<<< HEAD
23
14
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.
24
-
=======
25
-
So, because we can't technically do much here, there's no maths with objects in real projects. When it happens, with rare exceptions, it's because of a coding mistake.
26
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
27
15
28
16
Dans ce chapitre, nous verrons comment un objet se convertit en primitif et comment le personnaliser.
29
17
@@ -36,30 +24,20 @@ Nous avons deux objectifs :
36
24
37
25
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.
38
26
39
-
<<<<<<< HEAD
40
-
Pour les objets, il n’y a pas de conversion to-boolean, car tous les objets sont `true` dans un contexte booléen. Il n'y a donc que des conversions de chaînes de caractères et de chiffres.
41
-
42
-
1. Tous les objets sont `true` dans un contexte booléen. Il n'y a que des conversions numériques et de chaînes de caractères.
27
+
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.
43
28
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.
44
29
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.
45
30
46
31
47
-
Nous pouvons affiner la conversion de chaînes de caractères et de chiffres en utilisant des méthodes d’objet spéciales.
48
-
=======
49
-
1. There's no conversion to boolean. All objects are `true` in a boolean context, as simple as that. There exist only numeric and string conversions.
50
-
2. The numeric conversion happens when we subtract objects or apply mathematical functions. For instance, `Date` objects (to be covered in the chapter <info:date>) can be subtracted, and the result of `date1 - date2` is the time difference between two dates.
51
-
3. As for the string conversion -- it usually happens when we output an object with `alert(obj)` and in similar contexts.
52
-
53
-
We can implement string and numeric conversion by ourselves, using special object methods.
32
+
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.
54
33
55
-
Now let's get into technical details, because it's the only way to cover the topic in-depth.
34
+
Passons maintenant aux détails techniques, car c'est le seul moyen d'aborder le sujet en profondeur.
56
35
57
36
## Hints
58
37
59
-
How does JavaScript decide which conversion to apply?
38
+
Comment JavaScript décide-t-il quelle conversion appliquer ?
60
39
61
-
There are three variants of type conversion, that happen in various situations. They're called "hints", as described in the [specification](https://tc39.github.io/ecma262/#sec-toprimitive):
62
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
40
+
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) :
63
41
64
42
Il existe trois variantes de conversion de type, appelées "hints", décrites dans la [specification](https://tc39.github.io/ecma262/#sec-toprimitive) :
65
43
@@ -98,11 +76,7 @@ let greater = user1 > user2;
98
76
`"default"`
99
77
: Se produit dans de rares cas où l'opérateur n'est "pas sûr" du type auquel il doit s'attendre.
100
78
101
-
<<<<<<< HEAD
102
-
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 les chaînes de caractères et les chiffres feraient l'affaire. Donc, si le plus binaire obtient un objet sous forme d'argument, il utilise l'indicateur `"default"` pour le convertir.
103
-
=======
104
-
For instance, binary plus `+` can work both with strings (concatenates them) and numbers (adds them). So if a binary plus gets an object as an argument, it uses the `"default"` hint to convert it.
105
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
79
+
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.
106
80
107
81
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é.
108
82
@@ -116,37 +90,19 @@ let greater = user1 > user2;
116
90
117
91
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,
118
92
119
-
<<<<<<< HEAD
120
-
En pratique cependant, nous n'avons pas besoin de nous souvenir de ces détails particuliers, car tous les objets intégrés, à l'exception d'un cas (l'objet `Date`, nous l'apprendrons plus tard), implémentent la conversion `'default'` de la même manière que `"number"`. Et nous pouvons faire la même chose.
121
-
122
-
```smart header="Pas d'indice `\"boolean\"`"
123
-
Veuillez noter qu'il n'y a que trois indices. C'est aussi simple que cela.
93
+
En pratique cependant, les choses sont un peu plus simples.
124
94
125
-
Il n'y a pas d'indice "boolean" (tous les objets sont `true` dans un contexte booléen) ou autre chose. Et si nous traitons de la même manière `'default'` et `'number'`, comme le font la plupart des programmes intégrés, il n'y a au final que deux conversions.
126
-
```
127
-
=======
128
-
In practice though, things are a bit simpler.
129
-
130
-
All built-in objects except for one case (`Date` object, we'll learn it later) implement `"default"` conversion the same way as `"number"`. And we probably should do the same.
95
+
Tous les objets intégrés à l'exception d'un cas (objet `Date`, nous l'apprendrons plus tard) implémentent la conversion `"default"` de la même manière que `"number"`. Et nous devrions probablement faire de même.
131
96
132
-
Still, it's important to know about all 3 hints, soon we'll see why.
133
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
97
+
Pourtant, il est important de connaître les 3 hints, nous verrons bientôt pourquoi.
134
98
135
99
**Pour effectuer la conversion, JavaScript essaie de trouver et d'appeler trois méthodes d'objet :**
136
100
137
-
<<<<<<< HEAD
138
101
1. Appeler `obj[Symbol.toPrimitive](hint)` - la méthode avec la clé symbolique `Symbol.toPrimitive` (symbole système), si une telle méthode existe,
139
102
2. Sinon, si l'indice est `"string"`
140
-
- essaie `obj.toString()` et `obj.valueOf()`, tout ce qui existe.
103
+
- essaie d'appeler `obj.toString()` et `obj.valueOf()`, tout ce qui existe.
141
104
3. Sinon, si l'indice est `"number"` ou `"default"`
142
-
- essaie `obj.valueOf()` et `obj.toString()`, tout ce qui existe.
143
-
=======
144
-
1. Call `obj[Symbol.toPrimitive](hint)` - the method with the symbolic key `Symbol.toPrimitive` (system symbol), if such method exists,
145
-
2. Otherwise if hint is `"string"`
146
-
- try calling `obj.toString()` or `obj.valueOf()`, whatever exists.
147
-
3. Otherwise if hint is `"number"` or `"default"`
148
-
- try calling `obj.valueOf()` or `obj.toString()`, whatever exists.
149
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
105
+
- essaie d'appeler `obj.valueOf()` et `obj.toString()`, tout ce qui existe.
150
106
151
107
## Symbol.toPrimitive
152
108
@@ -181,24 +137,15 @@ alert(+user); // hint: number -> 1000
181
137
alert(user +500); // hint: default -> 1500
182
138
```
183
139
184
-
<<<<<<< HEAD
185
140
Comme on peut le voir d'après le code, `user` devient une chaîne de caractères auto-descriptive ou un montant d'argent en fonction de la conversion. La méthode unique `user[Symbol.toPrimitive]` gère tous les cas de conversion.
186
141
187
-
=======
188
-
As we can see from the code, `user` becomes a self-descriptive string or a money amount, depending on the conversion. The single method `user[Symbol.toPrimitive]` handles all conversion cases.
189
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
190
142
191
143
## toString / valueOf
192
144
193
145
S'il n'y a pas de `Symbol.toPrimitive` alors JavaScript essaie de trouver les méthodes `toString` et `valueOf` :
194
146
195
-
<<<<<<< HEAD
196
-
- Pour le hint "string" : `toString`, et s'il n'existe pas, alors `valueOf` (donc `toString` a la priorité pour les conversions de chaînes de caractères).
197
-
- Pour d'autres hints : `valueOf`, et s'il n'existe pas, alors `toString` (donc `valueOf` a la priorité pour les mathématiques).
198
-
=======
199
-
- For the `"string"` hint: call `toString` method, and if it doesn't exist or if it returns an object instead of a primitive value, then call `valueOf` (so `toString` has the priority for string conversions).
200
-
- For other hints: call `valueOf`, and if it doesn't exist or if it returns an object instead of a primitive value, then call `toString` (so `valueOf` has the priority for maths).
201
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
147
+
- Pour l'indice `"string"` : appel à la méthode `toString`, et si elle n'existe pas ou si elle renvoie un objet au lieu d'une valeur primitive, alors appel à `valueOf` (donc `toString` a la priorité pour la conversion de chaînes de caractères).
148
+
- Pour les autres hints : appel à `valueOf`, et s'il n'existe pas ou s'il renvoie un objet au lieu d'une valeur primitive, alors appel à `toString` (donc `valueOf` a la priorité pour les mathématiques).
202
149
203
150
Les méthodes `toString` et `valueOf` viennent des temps anciens. Ce ne sont pas des symboles (les symboles n'existaient pas il y a si longtemps), mais plutôt des méthodes nommées par des chaînes de caractères "normales". Ils fournissent une alternative "à l'ancienne" pour implémenter la conversion.
204
151
@@ -271,37 +218,23 @@ En l'absence de `Symbol.toPrimitive` et de `valueOf`, `toString` gérera toutes
271
218
272
219
La chose importante à savoir sur toutes les méthodes de conversion de primitives est qu'elles ne renvoient pas nécessairement la primitive "hinted".
273
220
274
-
<<<<<<< HEAD
275
-
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 un indice `"number"`.
276
-
=======
277
-
There is no control whether `toString` returns exactly a string, or whether `Symbol.toPrimitive` method returns a number for the hint `"number"`.
278
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
221
+
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"`.
279
222
280
223
**La seule chose obligatoire : ces méthodes doivent renvoyer une primitive, pas un objet.**
281
224
282
225
```smart header="Notes historiques"
283
226
Pour des raisons historiques, si `toString` ou `valueOf` renvoie un objet, il n’y a pas d’erreur, mais cette valeur est ignorée (comme si la méthode n’existait pas). C’est parce que jadis, il n’existait pas de bon concept "d’erreur" en JavaScript.
284
227
285
-
<<<<<<< HEAD
286
-
En revanche, `Symbol.toPrimitive` doit renvoyer une primitive, sinon une erreur se produira.
287
-
=======
288
-
In contrast, `Symbol.toPrimitive` is stricter, it *must* return a primitive, otherwise there will be an error.
289
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
228
+
En revanche, `Symbol.toPrimitive` est plus strict, il *doit* retourner une primitive, sinon il y aura une erreur.
290
229
```
291
230
292
231
## Autres conversions
293
232
294
233
Comme nous le savons déjà, de nombreux opérateurs et fonctions effectuent des conversions de types, par exemple la multiplication `*` convertit les opérandes en nombres.
295
234
296
-
<<<<<<< HEAD
297
-
Si nous passons un objet en argument, il y a deux étapes :
235
+
Si nous passons un objet en argument, il y a deux étapes de calcul :
298
236
1. L'objet est converti en primitive (en utilisant les règles décrites ci-dessus).
299
-
2. Si la primitive résultante n'est pas du bon type, elle est convertie.
300
-
=======
301
-
If we pass an object as an argument, then there are two stages of calculations:
302
-
1. The object is converted to a primitive (using the rules described above).
303
-
2. If the necessary for further calculations, the resulting primitive is also converted.
304
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
237
+
2. Si cela est nécessaire pour d'autres calculs, la primitive résultante est également convertie.
305
238
306
239
Par exemple :
307
240
@@ -335,42 +268,22 @@ alert(obj + 2); // 22 ("2" + 2), la conversion en primitive a renvoyé une chaî
335
268
336
269
La conversion objet à primitive est appelée automatiquement par de nombreuses fonctions intégrées et opérateurs qui attendent une primitive en tant que valeur.
337
270
338
-
<<<<<<< HEAD
339
271
Il en existe 3 types (hints) :
340
-
-[ ]`"string"` (pour `alert` et d'autres opérations qui nécessitent une chaîne de caractères)
272
+
-`"string"` (pour `alert` et d'autres opérations qui nécessitent une chaîne de caractères)
341
273
-`"number"` (pour des maths)
342
-
-`"default"` (peu d'opérateurs)
343
-
344
-
La spécification décrit explicitement quel opérateur utilise quel indice (hint). Très peu d’opérateurs "ne savent pas à quoi s’attendre" et utilisent l'indice `"default"`. Habituellement, pour les objets intégrés, l'indice `"default"` est traité de la même façon que `"number"`, de sorte qu'en pratique, les deux derniers sont souvent fusionnés.
345
-
=======
346
-
There are 3 types (hints) of it:
347
-
-`"string"` (for `alert` and other operations that need a string)
348
-
-`"number"` (for maths)
349
-
-`"default"` (few operators, usually objects implement it the same way as `"number"`)
274
+
-`"default"` (peu d'opérateurs, généralement des objets l'implémentent de la même manière que `"number"`)
350
275
351
-
The specification describes explicitly which operator uses which hint.
352
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
276
+
La spécification décrit explicitement quel opérateur utilise quel conseil.
353
277
354
278
L'algorithme de conversion est :
355
279
356
-
<<<<<<< HEAD
357
280
1. Appeler `obj[Symbol.toPrimitive](hint)` si la méthode existe,
358
281
2. Sinon, si l'indice est `"string"`
359
282
- essaie `obj.toString()` et `obj.valueOf()`, tout ce qui existe.
360
283
3. Sinon, si l'indice est `"number"` ou `"default"`
361
284
- essaie `obj.valueOf()` et `obj.toString()`, tout ce qui existe.
362
285
363
-
En pratique, il suffit souvent d'implémenter uniquement `obj.toString()` comme méthode "fourre-tout" pour les conversions de chaînes de caractères qui devraient renvoyer une représentation "lisible par l'homme" d'un objet, à des fins de journalisation ou de débogage.
286
+
Toutes ces méthodes doivent renvoyer une primitive pour fonctionner (si elle est définie).
364
287
365
-
En ce qui concerne les opérations mathématiques, JavaScript ne fournit pas de moyen de les "remplacer" à l'aide de méthodes, de sorte que les projets réels les utilisent rarement sur des objets.
366
-
=======
367
-
1. Call `obj[Symbol.toPrimitive](hint)` if the method exists,
368
-
2. Otherwise if hint is `"string"`
369
-
- try calling `obj.toString()` or `obj.valueOf()`, whatever exists.
370
-
3. Otherwise if hint is `"number"` or `"default"`
371
-
- try calling `obj.valueOf()` or `obj.toString()`, whatever exists.
372
-
373
-
All these methods must return a primitive to work (if defined).
288
+
En pratique, il suffit souvent d'implémenter uniquement `obj.toString()` comme méthode "fourre-tout" pour les conversions de chaînes de caractères qui devraient renvoyer une représentation "lisible par l'homme" d'un objet, à des fins de journalisation ou de débogage.
374
289
375
-
In practice, it's often enough to implement only `obj.toString()` as a "catch-all" method for string conversions that should return a "human-readable" representation of an object, for logging or debugging purposes.
0 commit comments