Skip to content

Commit b13d5bc

Browse files
authored
Merge pull request #367 from javascript-tutorial/sync-45934deb
Sync with upstream @ 45934de
2 parents 19b1283 + 5ba63b8 commit b13d5bc

File tree

18 files changed

+221
-12
lines changed

18 files changed

+221
-12
lines changed

1-js/02-first-steps/08-operators/article.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,11 @@ Un extrait du [tableau de précédence](https://developer.mozilla.org/en-US/docs
205205
| 2 | affectation | `=` |
206206
| ... | ... | ... |
207207

208+
<<<<<<< HEAD
208209
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.
212+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
209213
210214
## Affectation
211215

1-js/02-first-steps/17-arrow-functions-basics/article.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,11 @@ Comme vous pouvez le voir `(a, b) => a + b` représente une fonction qui accepte
4848
alert( double(3) ); // 6
4949
```
5050

51+
<<<<<<< HEAD
5152
- 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
5256

5357
```js run
5458
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
7680

7781
## Les fonctions fléchées multiligne
7882

83+
<<<<<<< HEAD
7984
L'exemple ci-dessous prend les arguments sur la gauche de `=>` et évalue le coté droit avec ces arguments.
8085
8186
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
8292
8393
Comme cela :
8494
@@ -105,7 +115,14 @@ Pour l'instant, nous pouvons les utiliser pour des actions sur une ligne ou des
105115

106116
## Résumé
107117

118+
<<<<<<< HEAD
108119
Les fonctions fléchées sont pratiques pour les déclarations sur une ligne. Elles ont deux syntaxes :
109120

110121
1. Sans accolades : `(...args) => expression` -- le coté droit est une expression : la fonction l'évalue et retourne le résultat.
111122
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.
128+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f

1-js/03-code-quality/01-debugging-chrome/article.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ Si nous appuyons sur `key:Esc`, une console s'ouvre ci-dessous. Nous pouvons tap
3838

3939
Une fois une instruction exécutée, son résultat est présenté ci-dessous.
4040

41+
<<<<<<< HEAD
4142
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
4246
4347
![](chrome-sources-console.svg)
4448

@@ -62,13 +66,22 @@ Nous pouvons toujours trouver une liste de points d'arrêt dans le volet de droi
6266
- Supprimer le point d'arrêt en cliquant avec le bouton droit de la souris et en sélectionnant Supprimer.
6367
- … Et ainsi de suite
6468

69+
<<<<<<< HEAD
6570
```smart header="Points d'arrêt conditionnels"
6671
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
6776
6877
C’est pratique lorsque nous devons nous arrêter uniquement pour une certaine valeur de variable ou pour certains paramètres de fonction.
6978
```
7079

80+
<<<<<<< HEAD
7181
## Commande du débogueur
82+
=======
83+
## The command "debugger"
84+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
7285
7386
Nous pouvons également suspendre le code en utilisant la commande `debugger`, comme ceci :
7487

@@ -84,8 +97,12 @@ function hello(name) {
8497
}
8598
```
8699

100+
<<<<<<< HEAD
87101
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.
88102

103+
=======
104+
Such command works only when the development tools are open, otherwise the browser ignores it.
105+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
89106
90107
## Pause et regarder autour
91108

@@ -99,7 +116,11 @@ Veuillez ouvrir les menus déroulants d’information à droite (indiqués par d
99116

100117
1. **`Watch` -- affiche les valeurs actuelles pour toutes les expressions.**
101118

119+
<<<<<<< HEAD
102120
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
103124
104125
2. **`Call Stack` -- affiche la chaîne des appels imbriqués.**
105126

@@ -134,12 +155,21 @@ Il y a des boutons pour cela en haut du volet de droite. Actionnons-les.
134155

135156
En cliquant dessus encore et encore, vous parcourrez toutes les instructions de script une par une.
136157

158+
<<<<<<< HEAD
137159
<span class="devtools" style="background-position:-62px -192px"></span> -- "Step over": lance la commande suivante, mais *n'entre pas dans une fonction*, raccourci clavier `key:F10`.
138160
: 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.
139161

140162
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.
141163

142164
L'exécution est alors suspendue immédiatement après cette fonction.
165+
=======
166+
<span class="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
143173
144174
C'est bien si nous ne sommes pas intéressés à voir ce qui se passe dans l'appel de fonction.
145175

@@ -154,8 +184,13 @@ Il y a des boutons pour cela en haut du volet de droite. Actionnons-les.
154184
<span class="devtools" style="background-position:-61px -74px"></span> -- active / désactive tous les points d'arrêt.
155185
: Ce bouton ne déplace pas l'exécution. Juste un ensemble de on/off pour les points d'arrêt.
156186

187+
<<<<<<< HEAD
157188
<span class="devtools" style="background-position:-90px -146px"></span> -- active/désactive la pause automatique en cas d'erreur.
158189
: 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+
<span class="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
159194
160195
```smart header="Continue to here"
161196
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
187222
2. Les instructions du `debugger`.
188223
3. Une erreur (si les outils de développement sont ouverts et le bouton <span class="devtools" style="background-position:-90px -146px"></span> est "on")
189224

225+
<<<<<<< HEAD
190226
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
191230
192231
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>.
193232

1-js/03-code-quality/06-polyfills/article.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,11 @@ Habituellement, un développeur exécute le transpiler sur son propre ordinateur
4242
4343
En parlant de noms, [Babel](https://babeljs.io) est l'un des transpileurs les plus connus.
4444
45+
<<<<<<< HEAD
4546
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
4650
4751
## Les polyfills
4852
@@ -82,7 +86,11 @@ Dans ce chapitre, nous aimerions vous motiver à étudier les fonctionnalités d
8286
8387
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.
8488
89+
<<<<<<< HEAD
8590
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
8694
8795
De bonnes ressources qui montrent l'état actuel de la prise en charge de diverses fonctionnalités :
8896
- <https://kangax.github.io/compat-table/es6/> - pour du pur JavaScript.

1-js/04-object-basics/07-optional-chaining/article.md

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ Dans de nombreux cas pratiques, nous préférerions obtenir `undefined` au lieu
3737
let html = document.querySelector('.elem').innerHTML; // error if it's null
3838
```
3939

40+
<<<<<<< HEAD
4041
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
4145
4246
Comment peut-on le faire ?
4347

@@ -49,11 +53,27 @@ let user = {};
4953
alert(user.address ? user.address.street : undefined);
5054
```
5155

56+
<<<<<<< HEAD
5257
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.
5358

5459
Par exemple. essayons d'obtenir `user.address.street.name`.
5560

5661
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.
76+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
5777
5878
```js
5979
let user = {}; // l'utilisateur n'a pas d'adresse
@@ -63,7 +83,11 @@ alert(user.address ? user.address.street ? user.address.street.name : null : nul
6383

6484
C'est juste horrible, on peut même avoir des problèmes pour comprendre un tel code.
6585

86+
<<<<<<< HEAD
6687
Ne vous en souciez même pas, car il existe une meilleure façon de l'écrire, en utilisant l'opérateur `&&` :
88+
=======
89+
There's a little better way to write it, using the `&&` operator:
90+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
6791
6892
```js run
6993
let user = {}; // l'utilisateur n'a pas d'adresse
@@ -98,7 +122,17 @@ alert( user?.address?.street ); // undefined (no error)
98122
99123
Le code est court et propre, il n'y a aucune duplication.
100124
125+
<<<<<<< HEAD
101126
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
102136
103137
```js run
104138
let user = null;
@@ -114,8 +148,14 @@ Par exemple. dans `user?.address.street.name` le `?.` permet à `user` d'être e
114148
```warn header="N'abusez pas du chaînage optionnel"
115149
Nous ne devrions utiliser `?.` que là où il est normal que quelque chose n'existe pas.
116150
151+
<<<<<<< HEAD
117152
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`.
118153

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
119159
```
120160
121161
````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
133173
Comme il a été dit précédemment, le `?.` arrête immédiatement ("court-circuite") l'évaluation si la partie gauche n'existe pas.
134174
135175
176+
<<<<<<< HEAD
136177
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
137181

138182
Par exemple :
139183

140184
```js run
141185
let user = null;
142186
let x = 0;
143187
188+
<<<<<<< HEAD
189+
=======
190+
user?.sayHi(x++); // no "user", so the execution doesn't reach sayHi call and x++
191+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
144192
145193
user?.sayHi(x++); // pas de "sayHi", donc l'exécution n'atteint pas x++
146194
@@ -171,10 +219,14 @@ userAdmin.admin?.(); // I am admin
171219
*/!*
172220
173221
*!*
174-
userGuest.admin?.(); // nothing (no such method)
222+
userGuest.admin?.(); // nothing happens (no such method)
175223
*/!*
176224
```
177225

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
178230
179231
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é.
180232
@@ -190,7 +242,7 @@ let user1 = {
190242
firstName: "John"
191243
};
192244
193-
let user2 = null;
245+
let user2 = null;
194246
195247
alert( user1?.[key] ); // John
196248
alert( user2?.[key] ); // undefined
@@ -212,14 +264,23 @@ For example:
212264

213265
let user = null;
214266

267+
<<<<<<< HEAD
215268
user?.name = "John"; // Erreur, ne fonctionne pas
216269
// car il évalue à undefined = "John"
270+
=======
271+
user?.name = "John"; // Error, doesn't work
272+
// because it evaluates to: undefined = "John"
273+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
217274
```
218275
Ce n'est tout simplement pas si intelligent.
219276
277+
<<<<<<< HEAD
220278
## Résumé
221279
222280
Le chaînage optionnel '?.' A trois formes :
281+
=======
282+
````
283+
>>>>>>> 45934debd9bb31376ea5da129e266df5b43e545f
223284
224285
1. `obj?.prop` -- retourne `obj.prop` si `obj` existe, sinon `undefined`.
225286
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
231292
Une chaîne de `?.` permet d'accéder en toute sécurité aux propriétés imbriquées.
232293
233294
295+
<<<<<<< HEAD
234296
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

0 commit comments

Comments
 (0)