Skip to content

Commit c653d1a

Browse files
authored
Merge pull request #260 from javascript-tutorial/sync-99e59ba6
Sync with upstream @ 99e59ba
2 parents 36ac1ee + 5063038 commit c653d1a

File tree

51 files changed

+474
-81
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+474
-81
lines changed

1-js/01-getting-started/1-intro/article.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,12 @@ Les exemples de telles restrictions sont:
6767

6868
Les navigateurs modernes lui permettent de fonctionner avec des fichiers, mais l'accès est limité et n'est fourni que si l'utilisateur effectue certaines actions, comme «déposer» un fichier dans une fenêtre de navigateur ou le sélectionner via une balise `<input>`.
6969

70+
<<<<<<< HEAD
7071
Il existe des moyens d’interagir avec une webcam/microphone et d’autres appareils, mais ils nécessitent une autorisation explicite de l’utilisateur. Ainsi, une page compatible avec JavaScript ne permet pas d'activer une caméra Web, d'observer l'environnement et d'envoyer les informations à la [NSA](https://fr.wikipedia.org/wiki/National_Security_Agency).
72+
=======
73+
There are ways to interact with camera/microphone and other devices, but they require a user's explicit permission. So a JavaScript-enabled page may not sneakily enable a web-camera, observe the surroundings and send the information to the [NSA](https://en.wikipedia.org/wiki/National_Security_Agency).
74+
- Different tabs/windows generally do not know about each other. Sometimes they do, for example when one window uses JavaScript to open the other one. But even in this case, JavaScript from one page may not access the other if they come from different sites (from a different domain, protocol or port).
75+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
7176
7277
- Différents onglets / fenêtres ne se connaissent généralement pas. Parfois, ils se croisent, par exemple lorsqu'une fenêtre utilise JavaScript pour ouvrir l'autre. Mais même dans ce cas, le JavaScript d'une page ne peut pas accéder à l'autre si elle provient de sites différents (provenant d'un autre domaine, protocole ou port).
7378

1-js/01-getting-started/4-devtools/article.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ Pour voir les erreurs et obtenir beaucoup d’informations utiles sur les script
88

99
Le plus souvent, les développeurs se tournent vers Chrome ou Firefox pour le développement, car ces navigateurs disposent des meilleurs outils de développement. D'autres navigateurs fournissent également des outils de développement, parfois dotés de fonctions spéciales, mais jouent généralement le rôle de "rattrapage" pour Chrome ou Firefox. Donc, la plupart des gens ont un navigateur "favori" et passent à d'autres si un problème est spécifique au navigateur.
1010

11+
<<<<<<< HEAD
1112
Les outils de développement sont très puissants, il existe de nombreuses fonctionnalités. Pour commencer, nous allons apprendre à les ouvrir, à examiner les erreurs et à exécuter des commandes JavaScript.
13+
=======
14+
Developer tools are potent, they have many features. To start, we'll learn how to open them, look at errors, and run JavaScript commands.
15+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
1216
1317
## Google Chrome
1418

1-js/03-code-quality/02-coding-style/article.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ Voici un exemple de `.eslintrc`:
334334
},
335335
"rules": {
336336
"no-console": 0,
337-
"indent": ["warning", 2]
337+
"indent": 2
338338
}
339339
}
340340
```

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@ Actuellement, Babel comporte deux parties :
2323

2424
2. Ensuite, le polyfill.
2525

26+
<<<<<<< HEAD
2627
Les nouvelles fonctionnalités du langage peuvent inclure de nouvelles fonctions intégrées et de nouvelles constructions de syntaxe. Le transpiler réécrit le code en transformant les nouvelles constructions de syntaxe en anciennes. Mais en ce qui concerne les nouvelles fonctions intégrées, nous devons les implémenter. JavaScript est un langage très dynamique, les scripts peuvent ajouter / modifier n’importe quelle fonction, afin qu’ils se comportent conformément au standard moderne.
28+
=======
29+
New language features may include not only syntax constructs, but also built-in functions.
30+
The transpiler rewrites the code, transforming syntax constructs into older ones. But as for new built-in functions, we need to implement them. JavaScript is a highly dynamic language, scripts may add/modify any functions, so that they behave according to the modern standard.
31+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
2732
2833
Un script qui met à jour / ajoute de nouvelles fonctions s'appelle "polyfill". Il "comble" le vide et ajoute les implémentations manquantes.
2934

1-js/04-object-basics/03-garbage-collection/article.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ En termes simples, les valeurs "accessibles" sont celles qui sont accessibles ou
2323

2424
2. Toute autre valeur est considérée comme accessible si elle est accessible depuis une racine par une référence ou par une chaîne de références.
2525

26+
<<<<<<< HEAD
2627
Par exemple, s’il existe un objet dans une variable globale et que cet objet a une propriété référençant un autre objet, cet objet est considéré comme accessible. Et ceux auxquels il fait référence sont également accessibles. Des exemples détaillés à suivre.
28+
=======
29+
For instance, if there's an object in a global variable, and that object has a property referencing another object, *that* object is considered reachable. And those that it references are also reachable. Detailed examples to follow.
30+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
2731
2832
Il existe un processus d’arrière-plan dans le moteur JavaScript appelé [Ramasse-miettes (Garbage Collector)](https://fr.wikipedia.org/wiki/Ramasse-miettes_(informatique)). Il surveille tous les objets et supprime ceux qui sont devenus inaccessibles.
2933

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

Lines changed: 99 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,29 @@ Le chaînage optionnel `?.` Est un moyen sécurisé d'accéder aux propriétés
1212

1313
Si vous venez de commencer à lire le tutoriel et à apprendre JavaScript, peut-être que le problème ne vous a pas encore touché, mais c'est assez courant.
1414

15+
<<<<<<< HEAD
1516

1617
À titre d'exemple, considérons les objets pour les données utilisateur. La plupart de nos utilisateurs ont des adresses dans la propriété `user.address`, avec la rue `user.address.street`, mais certains ne les ont pas fournies.
1718
Dans ce cas, lorsque nous tentons d'obtenir `user.address.street`, nous obtenons une erreur :
1819

1920
```js run
2021
let user = {}; // l'utilisateur sans propriété "address"
2122

23+
=======
24+
As an example, let's say we have `user` objects that hold the information about our users.
25+
26+
Most of our users have addresses in `user.address` property, with the street `user.address.street`, but some did not provide them.
27+
28+
In such case, when we attempt to get `user.address.street`, and the user happens to be without an address, we get an error:
29+
30+
```js run
31+
let user = {}; // a user without "address" property
32+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
2233
2334
alert(user.address.street); // Error!
2435
```
2536
37+
<<<<<<< HEAD
2638
2739
C'est le résultat attendu, JavaScript fonctionne comme ça, mais dans de nombreux cas pratiques, nous préférerions obtenir `undefined` au lieu d'une erreur (signifiant "pas de rue").
2840
@@ -37,32 +49,98 @@ let html = document.querySelector('.my-element').innerHTML;
3749
Avant l'apparition de `?.` Dans le langage, l'opérateur `&&` était utilisé pour contourner ce problème.
3850
3951
Par exemple :
52+
=======
53+
That's the expected result. JavaScript works like this. As `user.address` is `undefined`, an attempt to get `user.address.street` fails with an error.
54+
55+
In many practical cases we'd prefer to get `undefined` instead of an error here (meaning "no street").
56+
57+
...And another example. In the web development, we can get an object that corresponds to a web page element using a special method call, such as `document.querySelector('.elem')`, and it returns `null` when there's no such element.
58+
59+
```js run
60+
// document.querySelector('.elem') is null if there's no element
61+
let html = document.querySelector('.elem').innerHTML; // error if it's null
62+
```
63+
64+
Once again, if the element doesn't exist, we'll get an error accessing `.innerHTML` 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.
65+
66+
How can we do this?
67+
68+
The obvious solution would be to check the value using `if` or the conditional operator `?`, before accessing its property, like this:
69+
70+
```js
71+
let user = {};
72+
73+
alert(user.address ? user.address.street : undefined);
74+
```
75+
76+
It works, there's no error... But it's quite inelegant. As you can see, the `"user.address"` appears twice in the code. For more deeply nested properties, that becomes a problem as more repetitions are required.
77+
78+
E.g. let's try getting `user.address.street.name`.
79+
80+
We need to check both `user.address` and `user.address.street`:
81+
82+
```js
83+
let user = {}; // user has no address
84+
85+
alert(user.address ? user.address.street ? user.address.street.name : null : null);
86+
```
87+
88+
That's just awful, one may even have problems understanding such code.
89+
90+
Don't even care to, as there's a better way to write it, using the `&&` operator:
91+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
4092
4193
```js run
4294
let user = {}; // l'utilisateur n'a pas d'adresse
4395

44-
alert( user && user.address && user.address.street ); // undefined (no error)
96+
alert( user.address && user.address.street && user.address.street.name ); // undefined (no error)
4597
```
4698

99+
<<<<<<< HEAD
100+
=======
101+
AND'ing the whole path to the property ensures that all components exist (if not, the evaluation stops), but also isn't ideal.
102+
103+
As you can see, property names are still duplicated in the code. E.g. in the code above, `user.address` appears three times.
104+
105+
That's why the optional chaining `?.` was added to the language. To solve this problem once and for all!
106+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
47107
48108
ET l'ensemble du chemin d'accès à la propriété garantit que tous les composants existent (sinon, l'évaluation s'arrête), mais est difficile à écrire.
49109

50110

51111
## Chaînage optionnel
52112

113+
<<<<<<< HEAD
53114
Le chaînage facultatif `?.` Arrête l'évaluation et renvoie `undefined` si la partie avant `?.` est `undefined` ou `null`.
115+
=======
116+
The optional chaining `?.` stops the evaluation if the part before `?.` is `undefined` or `null` and returns that part.
117+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
54118
55119
**Plus loin dans cet article, par souci de brièveté, nous dirons que quelque chose "existe" si ce n'est pas "null" et non "undefined".**
56120

121+
<<<<<<< HEAD
57122
Voici le moyen sûr d'accéder `user.address.street` :
123+
=======
124+
In other words, `value?.prop`:
125+
- is the same as `value.prop` if `value` exists,
126+
- otherwise (when `value` is `undefined/null`) it returns `undefined`.
127+
128+
Here's the safe way to access `user.address.street` using `?.`:
129+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
58130
59131
```js run
60132
let user = {}; // l'utilisateur n'a pas d'adresse
61133

62134
alert( user?.address?.street ); // undefined (no error)
63135
```
64136
137+
<<<<<<< HEAD
65138
La lecture de l'adresse avec `user?.address` fonctionne même si l'objet `user` n'existe pas :
139+
=======
140+
The code is short and clean, there's no duplication at all.
141+
142+
Reading the address with `user?.address` works even if `user` object doesn't exist:
143+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
66144
67145
```js run
68146
let user = null;
@@ -73,17 +151,25 @@ alert( user?.address.street ); // undefined
73151
74152
Remarque: la syntaxe `?.` Rend facultative la valeur qui la précède, mais pas plus.
75153
154+
<<<<<<< HEAD
76155
Dans l'exemple ci-dessus, `user?.` Permet uniquement à `user` d'être `null/undefined`.
77156
78157
D'un autre côté, si `user` existe, alors il doit avoir la propriété `user.address`, sinon `user?.address.street` donne une erreur au deuxième point.
158+
=======
159+
E.g. in `user?.address.street.name` the `?.` allows `user` to be `null/undefined`, but it's all it does. Further properties are accessed in a regular way. If we want some of them to be optional, then we'll need to replace more `.` with `?.`.
160+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
79161
80162
```warn header="N'abusez pas du chaînage optionnel"
81163
Nous ne devrions utiliser `?.` que là où il est normal que quelque chose n'existe pas.
82164
165+
<<<<<<< HEAD
83166
Par exemple, si selon notre logique de codage, l'objet `user` doit être là, mais que `address` est facultatif, alors `user.address?.street` serait mieux.
84167

85168

86169
Donc, si `user` n'est pas défini en raison d'une erreur, nous verrons une erreur de programmation à ce sujet et la corrigerons. Sinon, les erreurs de codage peuvent être réduites au silence lorsqu'elles ne sont pas appropriées et devenir plus difficiles à déboguer.
170+
=======
171+
For example, if according to our coding logic `user` object must exist, but `address` is optional, then we should write `user.address?.street`, but not `user?.address?.street`.
172+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
87173
88174
```
89175
@@ -94,9 +180,13 @@ S'il n'y a pas du tout de variable `user`, alors `user?.anything` déclenche une
94180
// ReferenceError: user is not defined
95181
user?.address;
96182
```
183+
<<<<<<< HEAD
97184
98185
Il doit y avoir une déclaration (par exemple `let/const/var user`). Le chaînage optionnel ne fonctionne que pour les variables déclarées.
99186
187+
=======
188+
The variable must be declared (e.g. `let/const/var user` or as a function parameter). The optional chaining works only for declared variables.
189+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
100190
````
101191
102192
## Court-circuit
@@ -129,17 +219,20 @@ Par exemple, `?.()` est utilisé pour exécuter une fonction seulement si elle e
129219
Ainsi dans cet exemple la méthode `admin` n'existe pas pour tout le monde :
130220
131221
```js run
132-
let user1 = {
222+
let userAdmin = {
133223
admin() {
134224
alert("I am admin");
135225
}
136-
}
226+
};
227+
228+
let userGuest = {};
137229

138-
let user2 = {};
230+
*!*
231+
userAdmin.admin?.(); // I am admin
232+
*/!*
139233

140234
*!*
141-
user1.admin?.(); // I am admin
142-
user2.admin?.();
235+
userGuest.admin?.(); // nothing (no such method)
143236
*/!*
144237
```
145238

1-js/05-data-types/02-number/article.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,9 +408,13 @@ Quelques exemples:
408408
alert( Math.pow(2, 10) ); // 2 puissance 10 = 1024
409409
```
410410
411+
<<<<<<< HEAD
411412
Il y a plus de fonctions et de constantes dans l'objet Math, y compris la trigonométrie, que vous pouvez trouver dans la [documentation de l'objet Math](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Math).
412413
413414
## Résumé
415+
=======
416+
There are more functions and constants in `Math` object, including trigonometry, which you can find in the [docs for the Math object](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Math).
417+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
414418
415419
Pour écrire de nombres avec beaucoup de zéros :
416420

1-js/05-data-types/05-array-methods/2-filter-range/task.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ importance: 4
44

55
# Filter range
66

7+
<<<<<<< HEAD
78
Ecrivez une fonction `filterRange(arr, a, b)` qui obtient un tableau `arr`, recherche les éléments compris entre `a` et `b` et retourne un tableau.
9+
=======
10+
Write a function `filterRange(arr, a, b)` that gets an array `arr`, looks for elements with values higher or equal to `a` and lower or equal to `b` and return a result as an array.
11+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
812
913
La fonction ne doit pas modifier le tableau. Elle doit juste retourner le nouveau tableau.
1014

1-js/05-data-types/05-array-methods/article.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,13 @@ Ces méthodes sont les plus utilisées, elles couvrent 99% des cas d'utilisation
749749

750750
La fonction `fn` est appelée sur chaque élément du tableau comme pour `map`. Si n'importe quel/tous les résultats sont `true`, il retourne vrai, sinon il retourne `false`.
751751

752+
<<<<<<< HEAD
752753
Ces méthodes se comportent en quelque sorte comme les opérateurs `||` et `&&` : si `fn` renvoie une valeur vraie, `arr.some()` retourne immédiatement `true` et arrête d'itérer sur les autres éléments ; si `fn` renvoie une valeur fausse, `arr.every()` retourne immédiatement `false` et arrête également d'itérer sur les autres éléments.
754+
=======
755+
The function `fn` is called on each element of the array similar to `map`. If any/all results are `true`, returns `true`, otherwise `false`.
756+
757+
These methods behave sort of like `||` and `&&` operators: if `fn` returns a truthy value, `arr.some()` immediately returns `true` and stops iterating over the rest items; if `fn` returns a falsy value, `arr.every()` immediately returns `false` and stops iterating over the rest items as well.
758+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
753759
754760
On peut utiliser `every` pour compaere les tableaux :
755761
```js run

1-js/05-data-types/08-weakmap-weakset/article.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,14 @@ let array = [ john ];
3030
john = null; // écraser la référence
3131

3232
*!*
33+
<<<<<<< HEAD
3334
// John est stocké à l'intérieur du tableau, donc il ne sera pas nettoyé (garbage-collected)
3435
// nous pouvons l'atteindre avec array[0]
36+
=======
37+
// the object previously referenced by john is stored inside the array
38+
// therefore it won't be garbage-collected
39+
// we can get it as array[0]
40+
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
3541
*/!*
3642
```
3743

0 commit comments

Comments
 (0)