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/07-optional-chaining/article.md
+15-66Lines changed: 15 additions & 66 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -37,11 +37,7 @@ Dans de nombreux cas pratiques, nous préférerions obtenir `undefined` au lieu
37
37
let html =document.querySelector('.elem').innerHTML; // error if it's null
38
38
```
39
39
40
-
<<<<<<< HEAD
41
-
Encore une fois, si l'élément n'existe pas, nous obtiendrons une erreur lors de l'accès à `.innerHTML` de` null`. Et dans certains cas, lorsque l'absence de l'élément est normale, nous aimerions éviter l'erreur et accepter simplement `html = null` comme résultat.
42
-
=======
43
-
Once again, if the element doesn't exist, we'll get an error accessing `.innerHTML` property of `null`. And in some cases, when the absence of the element is normal, we'd like to avoid the error and just accept `html = null` as the result.
44
-
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
40
+
Encore une fois, si l'élément n'existe pas, nous obtiendrons une erreur lors de l'accès à la propriété `.innerHTML` de` null`. Et dans certains cas, lorsque l'absence de l'élément est normale, nous aimerions éviter l'erreur et accepter simplement `html = null` comme résultat.
Cela fonctionne, il n'y a pas d'erreur ... Mais c'est assez inélégant. Comme vous pouvez le voir, `"user.address"` apparaît deux fois dans le code. Pour des propriétés plus profondément imbriquées, cela devient un problème car plus de répétitions sont nécessaires.
52
+
Cela fonctionne, il n'y a pas d'erreur ... Mais c'est assez inélégant. Comme vous pouvez le voir, `"user.address"` apparaît deux fois dans le code.
58
53
59
-
Par exemple. essayons d'obtenir `user.address.street.name`.
60
54
61
-
Nous devons vérifier à la fois `user.address` et `user.address.street` :
62
-
=======
63
-
It works, there's no error... But it's quite inelegant. As you can see, the `"user.address"` appears twice in the code.
64
-
65
-
Here's how the same would look for `document.querySelector`:
55
+
Voici à quoi ressemblerait la même chose pour `document.querySelector` :
66
56
67
57
```js run
68
58
let html =document.querySelector('.elem') ?document.querySelector('.elem').innerHTML:null;
69
59
```
70
60
71
-
We can see that the element search`document.querySelector('.elem')`is actually called twice here. Not good.
61
+
Nous pouvons voir que l'élément de recherche`document.querySelector('.elem')`est en fait appelé deux fois ici. Pas bon.
72
62
73
-
For more deeply nested properties, it becomes even uglier, as more repetitions are required.
63
+
Pour les propriétés plus profondément imbriquées, cela devient encore plus laid, car davantage de répétitions sont nécessaires.
74
64
75
-
E.g. let's get `user.address.street.name` in a similar fashion.
76
-
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
65
+
Par exemple. récupérons `user.address.street.name` de la même manière.
Le code est court et propre, il n'y a aucune duplication.
124
109
125
-
<<<<<<< HEAD
126
-
La lecture de l'adresse avec `user?.address` fonctionne même si l'objet `user` n'existe pas :
127
-
=======
128
-
Here's an example with `document.querySelector`:
110
+
Voici un exemple avec `document.querySelector` :
129
111
130
112
```js run
131
113
let html =document.querySelector('.elem')?.innerHTML; // will be null, if there's no element
132
114
```
133
115
134
-
Reading the address with `user?.address` works even if `user` object doesn't exist:
135
-
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
116
+
La lecture de l'adresse avec `user?.address` fonctionne même si l'objet `user` n'existe pas :
136
117
137
118
```js run
138
119
let user =null;
@@ -148,14 +129,9 @@ Par exemple. dans `user?.address.street.name` le `?.` permet à `user` d'être e
148
129
```warn header="N'abusez pas du chaînage optionnel"
149
130
Nous ne devrions utiliser `?.` que là où il est normal que quelque chose n'existe pas.
150
131
151
-
<<<<<<< HEAD
152
132
Par exemple, si selon notre logique de codage, l'objet `user` doit exister, mais que `address` est facultatif, alors nous devrions écrire `user.address?.street`, mais pas `user?.address?.street`.
153
133
154
-
=======
155
-
For example, if according to our code logic `user` object must exist, but `address` is optional, then we should write `user.address?.street`, but not `user?.address?.street`.
156
-
157
-
Then, if`user` happens to be undefined, we'll see a programming error about it and fix it. Otherwise, if we overuse `?.`, coding errors can be silenced where not appropriate, and become more difficult to debug.
158
-
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
134
+
Ensuite, si `user` n'est pas défini, nous verrons une erreur de programmation à ce sujet et nous la corrigerons. Sinon, si nous abusons de `?.`, les erreurs de codage peuvent être réduites au silence là où cela n'est pas approprié et devenir plus difficiles à déboguer.
159
135
```
160
136
161
137
````warn header="La variable avant `?.` doit être déclarée"
@@ -173,24 +149,15 @@ La variable doit être déclarée (par exemple `let/const/var user` ou en tant q
173
149
Comme il a été dit précédemment, le `?.` arrête immédiatement ("court-circuite") l'évaluation si la partie gauche n'existe pas.
174
150
175
151
176
-
<<<<<<< HEAD
177
-
Donc, s'il y a d'autres appels de fonction ou effets secondaires, ils ne se produisent pas :
178
-
=======
179
-
So, if there are any further function calls or operations to the right of `?.`, they won't be made.
180
-
>>>>>>>45934debd9bb31376ea5da129e266df5b43e545f
152
+
Ainsi, s'il y a d'autres appels de fonction ou opérations à droite de `?.`, elles ne seront pas effectuées.
181
153
182
154
Par exemple :
183
155
184
156
```js run
185
157
let user = null;
186
158
let x = 0;
187
159
188
-
<<<<<<< HEAD
189
-
=======
190
-
user?.sayHi(x++); // no "user", so the execution doesn't reach sayHi call and x++
191
-
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
192
-
193
-
user?.sayHi(x++); // pas de "sayHi", donc l'exécution n'atteint pas x++
160
+
user?.sayHi(x++); // pas de "user", donc l'exécution n'atteint pas l'appel sayHi et x++
194
161
195
162
196
163
alert(x); // 0, la valeur n'est pas incrémenté
@@ -223,12 +190,7 @@ userGuest.admin?.(); // nothing happens (no such method)
223
190
*/!*
224
191
```
225
192
226
-
<<<<<<<HEAD
227
-
=======
228
-
Here, in both lines we first use the dot (`userAdmin.admin`) to get `admin` property, because we assume that the `user` object exists, so it's safe read from it.
229
-
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
230
-
231
-
Ici, dans les deux lignes, nous utilisons d'abord le point (`userAdmin.admin`) pour obtenir la propriété `admin`, car l'objet utilisateur doit exister, donc il peut être lu en toute sécurité.
193
+
Ici, dans les deux lignes, nous utilisons d'abord le point (`userAdmin.admin`) pour obtenir la propriété `admin`, car nous supposons que l'objet `user` existe, il peut donc être lu en toute sécurité.
232
194
233
195
Puis `?.()`Vérifie la partie gauche : si la fonction admin existe, alors elle s'exécute (c'est le cas pour `userAdmin`). Sinon (pour `userGuest`) l'évaluation s'arrête sans erreur.
234
196
@@ -264,23 +226,14 @@ For example:
264
226
265
227
let user = null;
266
228
267
-
<<<<<<<HEAD
268
229
user?.name = "John"; // Erreur, ne fonctionne pas
269
-
// car il évalue à undefined = "John"
270
-
=======
271
-
user?.name="John"; // Error, doesn't work
272
-
// because it evaluates to: undefined = "John"
273
-
>>>>>>>45934debd9bb31376ea5da129e266df5b43e545f
230
+
// car il évalue : undefined = "John"
274
231
```
275
232
Ce n'est tout simplement pas si intelligent.
276
233
277
-
<<<<<<< HEAD
278
234
## Résumé
279
235
280
236
Le chaînage optionnel '?.'A trois formes :
281
-
=======
282
-
````
283
-
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
284
237
285
238
1.`obj?.prop`-- retourne `obj.prop` si `obj` existe, sinon `undefined`.
286
239
2.`obj?.[prop]`-- retourne `obj[prop]` si `obj` existe, sinon `undefined`.
@@ -292,8 +245,4 @@ Comme nous pouvons le voir, tous sont simples et simples à utiliser. Le `?.` v
292
245
Une chaîne de `?.` permet d'accéder en toute sécurité aux propriétés imbriquées.
293
246
294
247
295
-
<<<<<<< HEAD
296
-
Néanmoins, nous devons appliquer `?.` avec soin, uniquement s'il est acceptable que la partie gauche n'existe pas. Pour ne pas nous cacher les erreurs de programmation, si elles se produisent.
297
-
=======
298
-
Still, we should apply `?.` carefully, only where it's acceptable, according to our code logic, that the left part doesn't exist. So that it won't hide programming errors from us, if they occur.
299
-
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
248
+
Néanmoins, nous devons appliquer `?.` avec précaution, uniquement là où il est acceptable, selon la logique de notre code, que la partie gauche n'existe pas. Pour qu'il ne nous cache pas les erreurs de programmation, si elles se produisent.
0 commit comments