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/02-first-steps/08-operators/article.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -205,7 +205,11 @@ Un extrait du [tableau de précédence](https://developer.mozilla.org/en-US/docs
205
205
| 2 | affectation |`=`|
206
206
| ... | ... | ... |
207
207
208
+
<<<<<<< HEAD
208
209
Comme on peut le voir, le "plus unaire" a une priorité de `15`, ce qui est supérieur à `12` pour "l'addition" (plus binaire). C’est pourquoi, dans l’expression `"+apples + +oranges"`, les plus unaires fonctionnent en premier, puis l’addition.
210
+
=======
211
+
As we can see, the "unary plus" has a priority of `15` which is higher than the `12` of "addition" (binary plus). That's why, in the expression `"+apples + +oranges"`, unary pluses work before the addition.
Copy file name to clipboardExpand all lines: 1-js/02-first-steps/17-arrow-functions-basics/article.md
+17Lines changed: 17 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -48,7 +48,11 @@ Comme vous pouvez le voir `(a, b) => a + b` représente une fonction qui accepte
48
48
alert( double(3) ); // 6
49
49
```
50
50
51
+
<<<<<<<HEAD
51
52
- Sans arguments, les parenthèses seront alors vides (mais elles doivent êtres présentes) :
53
+
=======
54
+
- If there are no arguments, parentheses are empty, but they must be present:
55
+
>>>>>>>45934debd9bb31376ea5da129e266df5b43e545f
52
56
53
57
```js run
54
58
let sayHi = () => alert("Hello!");
@@ -76,9 +80,15 @@ Elles sont très utile pour des actions sur une ligne et que l'on est juste pare
76
80
77
81
## Les fonctions fléchées multiligne
78
82
83
+
<<<<<<<HEAD
79
84
L'exemple ci-dessous prend les arguments sur la gauche de `=>` et évalue le coté droit avec ces arguments.
80
85
81
86
Parfois nous avons besoin de plus de compléxité, comme des expressions multiples ou des déclarations. Cela est possible avec des accolades les délimitant. Il faut ensuite utiliser un `return` à l'intérieur de celles-ci.
87
+
=======
88
+
The arrow functions that we've seen so far were very simple. They took arguments from the left of `=>`, evaluated and returned the right-side expression with them.
89
+
90
+
Sometimes we need a more complex function, with multiple expressions and statements. In that case, we can enclose them in curly braces. The major difference is that curly braces require a `return` within them to return a value (just like a regular function does).
91
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
82
92
83
93
Comme cela :
84
94
@@ -105,7 +115,14 @@ Pour l'instant, nous pouvons les utiliser pour des actions sur une ligne ou des
105
115
106
116
## Résumé
107
117
118
+
<<<<<<< HEAD
108
119
Les fonctions fléchées sont pratiques pour les déclarations sur une ligne. Elles ont deux syntaxes :
109
120
110
121
1. Sans accolades : `(...args) => expression` -- le coté droit est une expression : la fonction l'évalue et retourne le résultat.
111
122
2. Avec accolades : `(...args) => { body }` -- les accolades nous permet des déclarations multiples au sein de la fonction, mais nous devons ajouter un `return` pour retourner quelque chose.
123
+
=======
124
+
Arrow functions are handy for simple actions, especially for one-liners. They come in two flavors:
125
+
126
+
1. Without curly braces: `(...args) => expression` -- the right side is an expression: the function evaluates it and returns the result. Parentheses can be omitted, if there's only a single argument, e.g. `n => n*2`.
127
+
2. With curly braces: `(...args) => { body }` -- brackets allow us to write multiple statements inside the function, but we need an explicit `return` to return something.
Copy file name to clipboardExpand all lines: 1-js/03-code-quality/01-debugging-chrome/article.md
+39Lines changed: 39 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -38,7 +38,11 @@ Si nous appuyons sur `key:Esc`, une console s'ouvre ci-dessous. Nous pouvons tap
38
38
39
39
Une fois une instruction exécutée, son résultat est présenté ci-dessous.
40
40
41
+
<<<<<<< HEAD
41
42
Par exemple, ici `1+2` donne `3`, et `hello("débogueur")` ne renvoie rien, le résultat est donc `undefined` :
43
+
=======
44
+
For example, here `1+2` results in `3`, while the function call `hello("debugger")` returns nothing, so the result is `undefined`:
45
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
42
46
43
47

44
48
@@ -62,13 +66,22 @@ Nous pouvons toujours trouver une liste de points d'arrêt dans le volet de droi
62
66
- Supprimer le point d'arrêt en cliquant avec le bouton droit de la souris et en sélectionnant Supprimer.
63
67
- … Et ainsi de suite
64
68
69
+
<<<<<<< HEAD
65
70
```smart header="Points d'arrêt conditionnels"
66
71
Un *clic droit* sur le numéro de ligne permet de créer un point d'arrêt conditionnel. Cela ne se déclenche que lorsque l'expression donnée est vraie.
72
+
=======
73
+
```smart header="Conditional breakpoints"
74
+
*Right click* on the line number allows to create a *conditional* breakpoint. It only triggers when the given expression, that you should provide when you create it, is truthy.
75
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
67
76
68
77
C’est pratique lorsque nous devons nous arrêter uniquement pour une certaine valeur de variable ou pour certains paramètres de fonction.
69
78
```
70
79
80
+
<<<<<<< HEAD
71
81
## Commande du débogueur
82
+
=======
83
+
## The command "debugger"
84
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
72
85
73
86
Nous pouvons également suspendre le code en utilisant la commande `debugger`, comme ceci :
74
87
@@ -84,8 +97,12 @@ function hello(name) {
84
97
}
85
98
```
86
99
100
+
<<<<<<< HEAD
87
101
C’est très pratique lorsque vous utilisez un éditeur de code et que vous ne souhaitez pas passer au navigateur et rechercher le script dans les outils de développement pour définir le point d’arrêt.
88
102
103
+
=======
104
+
Such command works only when the development tools are open, otherwise the browser ignores it.
105
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
89
106
90
107
## Pause et regarder autour
91
108
@@ -99,7 +116,11 @@ Veuillez ouvrir les menus déroulants d’information à droite (indiqués par d
99
116
100
117
1.**`Watch` -- affiche les valeurs actuelles pour toutes les expressions.**
101
118
119
+
<<<<<<< HEAD
102
120
Vous pouvez cliquer sur le plus `+` et entrer une expression. Le débogueur affichera sa valeur à tout moment, en la recalculant automatiquement au cours de l'exécution.
121
+
=======
122
+
You can click the plus `+` and input an expression. The debugger will show its value, automatically recalculating it in the process of execution.
123
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
103
124
104
125
2.**`Call Stack` -- affiche la chaîne des appels imbriqués.**
105
126
@@ -134,12 +155,21 @@ Il y a des boutons pour cela en haut du volet de droite. Actionnons-les.
134
155
135
156
En cliquant dessus encore et encore, vous parcourrez toutes les instructions de script une par une.
136
157
158
+
<<<<<<< HEAD
137
159
<spanclass="devtools"style="background-position:-62px-192px"></span> -- "Step over": lance la commande suivante, mais *n'entre pas dans une fonction*, raccourci clavier `key:F10`.
138
160
: Semblable à la précédente commande "Step", mais se comporte différemment si l'instruction suivante est un appel de fonction. C’est-à-dire qu’il ne s’agit pas d’une fonction intégrée, comme `alert`, mais d’une fonction propre.
139
161
140
162
La commande "Step" y pénètre et met en pause l'exécution à la première ligne, tandis que "Step over" exécute l'appel de fonction imbriqué de manière invisible, en ignorant les éléments internes de la fonction.
141
163
142
164
L'exécution est alors suspendue immédiatement après cette fonction.
165
+
=======
166
+
<spanclass="devtools"style="background-position:-62px-192px"></span> -- "Step over": run the next command, but *don't go into a function*, hotkey `key:F10`.
167
+
: Similar to the previous "Step" command, but behaves differently if the next statement is a function call (not a built-in, like `alert`, but a function of our own).
168
+
169
+
If we compare them, the "Step" command goes into a nested function call and pauses the execution at its first line, while "Step over" executes the nested function call invisibly to us, skipping the function internals.
170
+
171
+
The execution is then paused immediately after that function call.
172
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
143
173
144
174
C'est bien si nous ne sommes pas intéressés à voir ce qui se passe dans l'appel de fonction.
145
175
@@ -154,8 +184,13 @@ Il y a des boutons pour cela en haut du volet de droite. Actionnons-les.
154
184
<spanclass="devtools"style="background-position:-61px-74px"></span> -- active / désactive tous les points d'arrêt.
155
185
: Ce bouton ne déplace pas l'exécution. Juste un ensemble de on/off pour les points d'arrêt.
156
186
187
+
<<<<<<< HEAD
157
188
<spanclass="devtools"style="background-position:-90px-146px"></span> -- active/désactive la pause automatique en cas d'erreur.
158
189
: Lorsque cette option est activée et que les outils de développement sont ouverts, une erreur de script interrompt automatiquement l'exécution. Ensuite, nous pouvons analyser les variables pour voir ce qui ne va pas. Donc, si notre script meurt avec une erreur, nous pouvons ouvrir le débogueur, activer cette option et recharger la page pour voir où il meurt et quel est le contexte à ce moment.
190
+
=======
191
+
<spanclass="devtools"style="background-position:-90px-146px"></span> -- enable/disable automatic pause in case of an error.
192
+
: When enabled, if the developer tools is open, an error during the script execution automatically pauses it. Then we can analyze variables in the debugger to see what went wrong. So if our script dies with an error, we can open debugger, enable this option and reload the page to see where it dies and what's the context at that moment.
193
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
159
194
160
195
```smart header="Continue to here"
161
196
Un clic droit sur une ligne de code ouvre le menu contextuel avec une excellente option appelée "Continue to here".
@@ -187,7 +222,11 @@ Comme nous pouvons le constater, il existe trois méthodes principales pour susp
187
222
2. Les instructions du `debugger`.
188
223
3. Une erreur (si les outils de développement sont ouverts et le bouton <spanclass="devtools"style="background-position:-90px-146px"></span> est "on")
189
224
225
+
<<<<<<< HEAD
190
226
En pause, nous pouvons déboguer -- examiner les variables et suivre le code pour voir où l’exécution s’est mal passée.
227
+
=======
228
+
When paused, we can debug: examine variables and trace the code to see where the execution goes wrong.
229
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
191
230
192
231
Il y a beaucoup plus d'options dans les outils de développement que celles couvertes ici. Le manuel complet est ici <https://developers.google.com/web/tools/chrome-devtools>.
Copy file name to clipboardExpand all lines: 1-js/03-code-quality/06-polyfills/article.md
+8Lines changed: 8 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -42,7 +42,11 @@ Habituellement, un développeur exécute le transpiler sur son propre ordinateur
42
42
43
43
En parlant de noms, [Babel](https://babeljs.io) est l'un des transpileurs les plus connus.
44
44
45
+
<<<<<<< HEAD
45
46
Les systèmes de construction de projets modernes, tels que [webpack](http://webpack.github.io/), fournissent des moyens pour exécuter un transpiler automatiquement à chaque changement de code, il est donc très facile à intégrer dans le processus de développement.
47
+
=======
48
+
Modern project build systems, such as [webpack](https://webpack.js.org/), provide means to run transpiler automatically on every code change, so it's very easy to integrate into development process.
49
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
46
50
47
51
## Les polyfills
48
52
@@ -82,7 +86,11 @@ Dans ce chapitre, nous aimerions vous motiver à étudier les fonctionnalités d
82
86
83
87
N'oubliez pas d'utiliser un transpiler (si vous utilisez une syntaxe ou des opérateurs modernes) et des polyfills (pour ajouter des fonctions qui peuvent manquer). Et ils veilleront à ce que le code fonctionne.
84
88
89
+
<<<<<<< HEAD
85
90
Par exemple, plus tard, lorsque vous serez familiarisé avec JavaScript, vous pourrez configurer un système de création de code basé sur [webpack](http://webpack.github.io/) avec le plugin [babel-loader](https://github.com/babel/babel-loader).
91
+
=======
92
+
For example, later when you're familiar with JavaScript, you can setup a code build system based on [webpack](https://webpack.js.org/) with [babel-loader](https://github.com/babel/babel-loader) plugin.
93
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
86
94
87
95
De bonnes ressources qui montrent l'état actuel de la prise en charge de diverses fonctionnalités :
88
96
- <https://kangax.github.io/compat-table/es6/> - pour du pur JavaScript.
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/07-optional-chaining/article.md
+67-2Lines changed: 67 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -37,7 +37,11 @@ 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
40
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.
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.
53
58
54
59
Par exemple. essayons d'obtenir `user.address.street.name`.
55
60
56
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`:
66
+
67
+
```js run
68
+
let html =document.querySelector('.elem') ?document.querySelector('.elem').innerHTML:null;
69
+
```
70
+
71
+
We can see that the element search `document.querySelector('.elem')` is actually called twice here. Not good.
72
+
73
+
For more deeply nested properties, it becomes even uglier, as more repetitions are required.
74
+
75
+
E.g. let's get `user.address.street.name` in a similar fashion.
Le code est court et propre, il n'y a aucune duplication.
100
124
125
+
<<<<<<< HEAD
101
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`:
129
+
130
+
```js run
131
+
let html =document.querySelector('.elem')?.innerHTML; // will be null, if there's no element
132
+
```
133
+
134
+
Reading the address with `user?.address` works even if `user` object doesn't exist:
135
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
102
136
103
137
```js run
104
138
let user =null;
@@ -114,8 +148,14 @@ Par exemple. dans `user?.address.street.name` le `?.` permet à `user` d'être e
114
148
```warn header="N'abusez pas du chaînage optionnel"
115
149
Nous ne devrions utiliser `?.` que là où il est normal que quelque chose n'existe pas.
116
150
151
+
<<<<<<< HEAD
117
152
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`.
118
153
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
119
159
```
120
160
121
161
````warn header="La variable avant `?.` doit être déclarée"
@@ -133,14 +173,22 @@ La variable doit être déclarée (par exemple `let/const/var user` ou en tant q
133
173
Comme il a été dit précédemment, le `?.` arrête immédiatement ("court-circuite") l'évaluation si la partie gauche n'existe pas.
134
174
135
175
176
+
<<<<<<< HEAD
136
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
137
181
138
182
Par exemple :
139
183
140
184
```js run
141
185
let user = null;
142
186
let x = 0;
143
187
188
+
<<<<<<< HEAD
189
+
=======
190
+
user?.sayHi(x++); // no "user", so the execution doesn't reach sayHi call and x++
191
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
144
192
145
193
user?.sayHi(x++); // pas de "sayHi", donc l'exécution n'atteint pas x++
146
194
@@ -171,10 +219,14 @@ userAdmin.admin?.(); // I am admin
171
219
*/!*
172
220
173
221
*!*
174
-
userGuest.admin?.(); // nothing (no such method)
222
+
userGuest.admin?.(); // nothing happens (no such method)
175
223
*/!*
176
224
```
177
225
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
178
230
179
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é.
180
232
@@ -190,7 +242,7 @@ let user1 = {
190
242
firstName: "John"
191
243
};
192
244
193
-
let user2 = null;
245
+
let user2 = null;
194
246
195
247
alert( user1?.[key] ); // John
196
248
alert( user2?.[key] ); // undefined
@@ -212,14 +264,23 @@ For example:
212
264
213
265
let user =null;
214
266
267
+
<<<<<<<HEAD
215
268
user?.name="John"; // Erreur, ne fonctionne pas
216
269
// car il évalue à undefined = "John"
270
+
=======
271
+
user?.name="John"; // Error, doesn't work
272
+
// because it evaluates to: undefined = "John"
273
+
>>>>>>>45934debd9bb31376ea5da129e266df5b43e545f
217
274
```
218
275
Ce n'est tout simplement pas si intelligent.
219
276
277
+
<<<<<<< HEAD
220
278
## Résumé
221
279
222
280
Le chaînage optionnel '?.' A trois formes :
281
+
=======
282
+
````
283
+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
223
284
224
285
1. `obj?.prop` -- retourne `obj.prop` si `obj` existe, sinon `undefined`.
225
286
2. `obj?.[prop]` -- retourne `obj[prop]` si `obj` existe, sinon `undefined`.
@@ -231,4 +292,8 @@ Comme nous pouvons le voir, tous sont simples et simples à utiliser. Le `?.` v
231
292
Une chaîne de `?.` permet d'accéder en toute sécurité aux propriétés imbriquées.
232
293
233
294
295
+
<<<<<<< HEAD
234
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.
0 commit comments