Skip to content

Commit fe055dd

Browse files
authored
Merge pull request #246 from javascript-tutorial/sync-0599d07b
Sync with upstream @ 0599d07
2 parents a52968b + 76929ef commit fe055dd

File tree

18 files changed

+257
-110
lines changed

18 files changed

+257
-110
lines changed

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Une Introduction à JavaScript
22

3+
<<<<<<< HEAD
34
Voyons ce qui est spécial à propos de JavaScript, ce qu'il nous permet de faire et avec quelles autres technologies il s'accorde bien.
5+
=======
6+
Let's see what's so special about JavaScript, what we can achieve with it, and what other technologies play well with it.
7+
>>>>>>> 0599d07b3c13ee25f583fc091cead3c17a7e7779
48
59
## Qu'est-ce que JavaScript?
610

@@ -67,7 +71,12 @@ Les exemples de telles restrictions sont:
6771

6872
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>`.
6973

74+
<<<<<<< HEAD
7075
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).
76+
=======
77+
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).
78+
- 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).
79+
>>>>>>> 0599d07b3c13ee25f583fc091cead3c17a7e7779
7180
7281
- 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).
7382

@@ -119,6 +128,12 @@ Il en existe évidemment bien plus, cela dit, même si nous utilisons un de ces
119128

120129
## Résumé
121130

131+
<<<<<<< HEAD
122132
- JavaScript a été initialement créé en tant que langage de navigateur uniquement, mais il est désormais également utilisé dans de nombreux autres environnements.
123133
- En ce moment, JavaScript occupe une position unique en tant que langage de navigateur le plus largement adopté avec une intégration complète avec HTML / CSS.
124134
- De nombreux langages sont "transpilés" en JavaScript et fournissent certaines fonctionnalités. Il est recommandé d'y jeter un coup d'œil, au moins brièvement, après avoir maîtrisé JavaScript.
135+
=======
136+
- JavaScript was initially created as a browser-only language, but it is now used in many other environments as well.
137+
- Today, JavaScript has a unique position as the most widely-adopted browser language with full integration in HTML/CSS.
138+
- There are many languages that get "transpiled" to JavaScript and provide certain features. It is recommended to take a look at them, at least briefly, after mastering JavaScript.
139+
>>>>>>> 0599d07b3c13ee25f583fc091cead3c17a7e7779

1-js/02-first-steps/18-javascript-specials/article.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,11 @@ Affectations
144144
: Il y a une assignation simple : `a = b` et des combinés comme `a *= 2`.
145145

146146
Bitwise
147+
<<<<<<< HEAD
147148
: Les opérateurs au niveau des bits fonctionnent avec des entiers de niveau binaire : voir la [doc](mdn:/JavaScript/Reference/Operators/Bitwise_Operators) quand ils sont nécessaires.
149+
=======
150+
: Bitwise operators work with 32-bit integers at the lowest, bit-level: see the [docs](mdn:/JavaScript/Guide/Expressions_and_Operators#Bitwise) when they are needed.
151+
>>>>>>> 0599d07b3c13ee25f583fc091cead3c17a7e7779
148152
149153
Conditionnel
150154
: Le seul opérateur avec trois paramètres : `cond ? resultA : resultB`. Si `cond` est vrai, retourne `resultA`, autrement `resultB`.

1-js/04-object-basics/01-object/8-multiply-numeric/task.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@ importance: 3
22

33
---
44

5+
<<<<<<< HEAD
56
# Multipliez les propriétés numériques par 2
67

78
Créez une fonction `multiplyNumeric(obj)` qui multiplie toutes les propriétés numériques de `obj` par `2`.
9+
=======
10+
# Multiply numeric property values by 2
11+
12+
Create a function `multiplyNumeric(obj)` that multiplies all numeric property values of `obj` by `2`.
13+
>>>>>>> 0599d07b3c13ee25f583fc091cead3c17a7e7779
814
915
Par exemple :
1016

1-js/04-object-basics/02-object-copy/article.md

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
# Object copying, references
1+
# Object references and copying
22

3-
One of the fundamental differences of objects vs primitives is that they are stored and copied "by reference".
3+
One of the fundamental differences of objects versus primitives is that objects are stored and copied "by reference", as opposed to primitive values: strings, numbers, booleans, etc -- that are always copied "as a whole value".
44

5-
Primitive values: strings, numbers, booleans -- are assigned/copied "as a whole value".
5+
That's easy to understand if we look a bit "under a cover" of what happens when we copy a value.
66

7-
For instance:
7+
Let's start with a primitive, such as a string.
8+
9+
Here we put a copy of `message` into `phrase`:
810

911
```js
1012
let message = "Hello!";
@@ -15,21 +17,31 @@ As a result we have two independent variables, each one is storing the string `"
1517

1618
![](variable-copy-value.svg)
1719

20+
Quite an obvious result, right?
21+
1822
Objects are not like that.
1923

20-
**A variable stores not the object itself, but its "address in memory", in other words "a reference" to it.**
24+
**A variable assigned to an object stores not the object itself, but its "address in memory", in other words "a reference" to it.**
2125

22-
Here's the picture for the object:
26+
Let's look at an example of such variable:
2327

2428
```js
2529
let user = {
2630
name: "John"
2731
};
2832
```
2933

34+
And here's how it's actually stored in memory:
35+
3036
![](variable-contains-reference.svg)
3137

32-
Here, the object is stored somewhere in memory. And the variable `user` has a "reference" to it.
38+
The object is stored somewhere in memory (at the right of the picture), while the `user` variable (at the left) has a "reference" to it.
39+
40+
We may think of an object variable, such as `user`, as of a sheet of paper with the address.
41+
42+
When we perform actions with the object, e.g. take a property `user.name`, JavaScript engine looks into that address and performs the operation on the actual object.
43+
44+
Now here's why it's important.
3345

3446
**When an object variable is copied -- the reference is copied, the object is not duplicated.**
3547

@@ -45,6 +57,8 @@ Now we have two variables, each one with the reference to the same object:
4557

4658
![](variable-copy-reference.svg)
4759

60+
As you can see, there's still one object, now with two variables that reference it.
61+
4862
We can use any variable to access the object and modify its contents:
4963

5064
```js run
@@ -59,15 +73,14 @@ admin.name = 'Pete'; // changed by the "admin" reference
5973
alert(*!*user.name*/!*); // 'Pete', changes are seen from the "user" reference
6074
```
6175
62-
The example above demonstrates that there is only one object. As if we had a cabinet with two keys and used one of them (`admin`) to get into it. Then, if we later use another key (`user`) we can see changes.
6376
64-
## Comparison by reference
77+
It's just as if we had a cabinet with two keys and used one of them (`admin`) to get into it. Then, if we later use another key (`user`) we can see changes.
6578
66-
The equality `==` and strict equality `===` operators for objects work exactly the same.
79+
## Comparison by reference
6780
68-
**Two objects are equal only if they are the same object.**
81+
Two objects are equal only if they are the same object.
6982
70-
Here two variables reference the same object, thus they are equal:
83+
For instance, here `a` and `b` reference the same object, thus they are equal:
7184
7285
```js run
7386
let a = {};
@@ -77,7 +90,7 @@ alert( a == b ); // true, both variables reference the same object
7790
alert( a === b ); // true
7891
```
7992
80-
And here two independent objects are not equal, even though both are empty:
93+
And here two independent objects are not equal, even though they look alike (both are empty):
8194
8295
```js run
8396
let a = {};
@@ -86,7 +99,7 @@ let b = {}; // two independent objects
8699
alert( a == b ); // false
87100
```
88101
89-
For comparisons like `obj1 > obj2` or for a comparison against a primitive `obj == 5`, objects are converted to primitives. We'll study how object conversions work very soon, but to tell the truth, such comparisons occur very rarely, usually as a result of a coding mistake.
102+
For comparisons like `obj1 > obj2` or for a comparison against a primitive `obj == 5`, objects are converted to primitives. We'll study how object conversions work very soon, but to tell the truth, such comparisons are needed very rarely, usually they appear as a result of a programming mistake.
90103
91104
## Cloning and merging, Object.assign
92105

1-js/04-object-basics/04-object-methods/article.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,19 @@ user.sayHi = function() {
3232
user.sayHi(); // Hello!
3333
```
3434

35+
<<<<<<< HEAD
3536
Ici, nous venons d'utiliser une expression de fonction pour créer la fonction et l'affecter à la propriété `user.sayHi` de l'objet.
3637

3738
Ensuite, nous pouvons l'appeler. L'utilisateur peut maintenant parler!
3839

3940
Une fonction qui est la propriété d'un objet s'appelle sa *méthode*.
41+
=======
42+
Here we've just used a Function Expression to create a function and assign it to the property `user.sayHi` of the object.
43+
44+
Then we can call it as `user.sayHi()`. The user can now speak!
45+
46+
A function that is a property of an object is called its *method*.
47+
>>>>>>> 0599d07b3c13ee25f583fc091cead3c17a7e7779
4048
4149
Nous avons donc ici une méthode `sayHi` de l’objet `user`.
4250

@@ -160,14 +168,24 @@ let user = {
160168
let admin = user;
161169
user = null; // écraser pour rendre les choses évidentes
162170

171+
<<<<<<< HEAD
163172
admin.sayHi(); // Oups ! Dans sayHi(), l'ancien nom est utilisé ! Erreur !
173+
=======
174+
*!*
175+
admin.sayHi(); // TypeError: Cannot read property 'name' of null
176+
*/!*
177+
>>>>>>> 0599d07b3c13ee25f583fc091cead3c17a7e7779
164178
```
165179

166180
Si nous utilisions `this.name` au lieu de `user.name` dans l'`alert`, le code fonctionnerait.
167181

168182
## "this" n'est pas lié
169183

184+
<<<<<<< HEAD
170185
En JavaScript, le mot clé `this` se comporte différemment de la plupart des autres langages de programmation. Il peut être utilisé dans n'importe quelle fonction.
186+
=======
187+
In JavaScript, keyword `this` behaves unlike most other programming languages. It can be used in any function, even if it's not a method of an object.
188+
>>>>>>> 0599d07b3c13ee25f583fc091cead3c17a7e7779
171189
172190
Il n’y a pas d’erreur de syntaxe dans le code suivant :
173191

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

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,30 @@
44

55
[recent browser="new"]
66

7-
Le chaînage optionnel `?.` Est un moyen sans erreur d'accéder aux propriétés d'objet imbriquées, même si une propriété intermédiaire n'existe pas.
87

9-
## Le problème
8+
Le chaînage optionnel `?.` Est un moyen sécurisé d'accéder aux propriétés d'objet imbriquées, même si une propriété intermédiaire n'existe pas.
9+
10+
## Le problème de la "propriété non existante"
11+
1012

1113
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.
1214

13-
Par exemple, certains de nos utilisateurs ont des adresses, mais peu ne les ont pas fournies. Ensuite, nous ne pouvons pas lire en toute sécurité `user.address.street` :
15+
16+
À 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.
17+
Dans ce cas, lorsque nous tentons d'obtenir `user.address.street`, nous obtenons une erreur :
1418

1519
```js run
16-
let user = {}; // l'utilisateur se trouve être sans adresse
20+
let user = {}; // l'utilisateur sans propriété "address"
21+
1722

1823
alert(user.address.street); // Error!
1924
```
2025

21-
Ou, dans le développement Web, nous aimerions obtenir une information sur un élément de la page, mais il peut ne pas exister :
26+
27+
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").
28+
29+
... Et un autre exemple. Dans le développement Web, nous pouvons avoir besoin d'obtenir une information sur un élément de la page, qui n'existe parfois pas:
30+
2231

2332
```js run
2433
// Erreur si le résultat de querySelector(...) est null
@@ -35,7 +44,9 @@ let user = {}; // l'utilisateur n'a pas d'adresse
3544
alert( user && user.address && user.address.street ); // undefined (no error)
3645
```
3746

38-
ET le chemin d'accès complet à la propriété garantit que tous les composants existent, mais il est difficile à écrire.
47+
48+
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.
49+
3950

4051
## Chaînage optionnel
4152

@@ -71,7 +82,9 @@ Nous ne devrions utiliser `?.` que là où il est normal que quelque chose n'exi
7182
7283
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.
7384

74-
Donc, si `user` n'est pas défini à cause d'une erreur, nous le saurons et le réparerons. Sinon, les erreurs de codage peuvent être réduites au silence lorsqu'elles ne sont pas appropriées et devenir plus difficiles à déboguer.
85+
86+
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.
87+
7588
```
7689
7790
````warn header="La variable avant `?.` doit être déclarée"
@@ -81,26 +94,33 @@ S'il n'y a pas du tout de variable `user`, alors `user?.anything` déclenche une
8194
// ReferenceError: user is not defined
8295
user?.address;
8396
```
84-
Il doit y avoir `let/const/var user`. Le chaînage optionnel ne fonctionne que pour les variables déclarées.
97+
98+
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.
99+
85100
````
86101
87102
## Court-circuit
88103
89104
Comme il a été dit précédemment, le `?.` arrête immédiatement ("court-circuite") l'évaluation si la partie gauche n'existe pas.
90105
106+
91107
Donc, s'il y a d'autres appels de fonction ou effets secondaires, ils ne se produisent pas :
92108
109+
Par exemple :
110+
93111
```js run
94112
let user = null;
95113
let x = 0;
96114
97-
user?.sayHi(x++); // rien ne se passe
115+
116+
user?.sayHi(x++); // pas de "sayHi", donc l'exécution n'atteint pas x++
117+
98118
99119
alert(x); // 0, la valeur n'est pas incrémenté
100120
```
101121
102122
103-
## Autres cas : ?.(), ?.[]
123+
## Autres variantes : ?.(), ?.[]
104124
105125
`?.` n'est pas un opérateur, mais une construction syntaxique particulière qui fonctionne aussi avec les appels de fonction et les crochets.
106126
@@ -123,9 +143,10 @@ user2.admin?.();
123143
*/!*
124144
```
125145
126-
Ici, dans les deux lignes, nous utilisons d'abord le point `.` pour obtenir la propriété `admin`, car l'objet utilisateur doit exister, il peut donc être lu en toute sécurité.
127146
128-
Puis `?.()` Vérifie la partie gauche : si la fonction admin existe, alors elle s'exécute (pour `user1`). Sinon (pour `user2`), l'évaluation s'arrête sans erreur.
147+
Ici, dans les deux lignes, nous utilisons d'abord le point (`user1.admin`) pour obtenir la propriété `admin`, car l'objet utilisateur doit exister, donc il peut être lu en toute sécurité.
148+
Puis `?.()` Vérifie la partie gauche : si la fonction admin existe, alors elle s'exécute (c'est le cas pour `user1`). Sinon (pour `user2`) l'évaluation s'arrête sans erreur.
149+
129150
130151
La syntaxe `?.[]` Fonctionne également, si nous voulons utiliser des crochets `[]` pour accéder aux propriétés au lieu du point `.`. Similaire aux cas précédents, il permet de lire en toute sécurité une propriété à partir d'un objet qui peut ne pas exister.
131152
@@ -150,28 +171,34 @@ Nous pouvons également utiliser `?.` avec `delete` :
150171
delete user?.name; // supprime user.name si user existe
151172
```
152173
174+
153175
```warn header="Nous pouvons utiliser `?.` pour lire et supprimer en toute sécurité, mais pas pour écrire"
154176
Le chaînage optionnel `?.` n'a aucune utilité sur le côté gauche d'une affectation :
155177

178+
179+
For example:
156180
```js run
157-
// l'idée du code ci-dessous est d'écrire user.name, si l'utilisateur existe
181+
182+
let user = null;
158183
159184
user?.name = "John"; // Erreur, ne fonctionne pas
160185
// car il évalue à undefined = "John"
161186
```
187+
Ce n'est tout simplement pas si intelligent.
162188
163189
## Résumé
164190
165-
La syntaxe `?.` A trois formes :
191+
Le chaînage optionnel '?.' A trois formes :
166192
167193
1. `obj?.prop` -- retourne `obj.prop` si `obj` existe, sinon `undefined`.
168194
2. `obj?.[prop]` -- retourne `obj[prop]` si `obj` existe, sinon `undefined`.
169-
3. `obj?.method()` -- appel `obj.method()` si `obj` existe, sinon retourne `undefined`.
195+
3. `obj?.method()` -- appel `obj.method()` si `obj.method` existe, sinon retourne `undefined`.
196+
170197
171198
Comme nous pouvons le voir, tous sont simples et simples à utiliser. Le `?.` vérifie la partie gauche pour `nul/undefined` et permet à l'évaluation de se poursuivre si ce n'est pas le cas.
172199
173200
Une chaîne de `?.` permet d'accéder en toute sécurité aux propriétés imbriquées.
174201

175-
Néanmoins, nous devons appliquer `?.` Avec soin, uniquement là où il est normal que la partie gauche n'existe pas.
176202

177-
Pour qu'il ne nous cache pas les erreurs de programmation, si elles se produisent.
203+
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.
204+

1-js/05-data-types/03-string/article.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,11 @@ alert( 'I*!*\'*/!*m the Walrus!' ); // *!*I'm*/!* the Walrus!
111111

112112
Comme vous pouvez le constater, nous devons précéder le simple quote intérieure du backslash `\'`, sinon, cela indiquerait la fin de la chaîne de caractères.
113113

114+
<<<<<<< HEAD
114115
Bien sûr, il ne faut échapper que les guillemets identiques à ceux qui les entourent. Donc, comme solution plus élégante, nous pourrions passer aux guillemets doubles ou aux backticks :
116+
=======
117+
Of course, only the quotes that are the same as the enclosing ones need to be escaped. So, as a more elegant solution, we could switch to double quotes or backticks instead:
118+
>>>>>>> 0599d07b3c13ee25f583fc091cead3c17a7e7779
115119
116120
```js run
117121
alert( `I'm the Walrus!` ); // I'm the Walrus!
@@ -316,7 +320,11 @@ if (str.indexOf("Widget") != -1) {
316320
#### L'astuce du NON binaire
317321
L’un des vieux trucs utilisés ici est l'opérateur [NON binaire](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Op%C3%A9rateurs/Op%C3%A9rateurs_binaires#(NON_binaire)) `~`. Il convertit le nombre en un entier de 32 bits (supprime la partie décimale, s'elle existe), puis inverse tous les bits de sa représentation binaire.
318322

323+
<<<<<<< HEAD
319324
Pour les entiers 32 bits, l'appel `~n` signifie exactement la même chose que `-(n+1)` (en raison du format IEEE-754).
325+
=======
326+
One of the old tricks used here is the [bitwise NOT](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_NOT) `~` operator. It converts the number to a 32-bit integer (removes the decimal part if exists) and then reverses all bits in its binary representation.
327+
>>>>>>> 0599d07b3c13ee25f583fc091cead3c17a7e7779
320328
321329
En pratique, cela signifie une chose simple: pour les entiers 32 bits, `~n` est égal à `-(n + 1)`.
322330

@@ -349,7 +357,11 @@ Il n'est généralement pas recommandé d'utiliser les fonctionnalités du langa
349357

350358
Rappelez-vous juste que : `if (~str.indexOf(...))` se lit "si trouvé".
351359

360+
<<<<<<< HEAD
352361
Pour être précis cependant, les grands nombres sont tronqués à 32 bits par l'opérateur `~`. Il existe donc d'autres gros nombres qui donnent `0`, le plus petit correspondant à `~4294967295 = 0`. Cela rend cette vérification est correcte que si une chaîne n'est pas si longue.
362+
=======
363+
To be precise though, as big numbers are truncated to 32 bits by `~` operator, there exist other numbers that give `0`, the smallest is `~4294967295=0`. That makes such check correct only if a string is not that long.
364+
>>>>>>> 0599d07b3c13ee25f583fc091cead3c17a7e7779
353365
354366
Pour le moment, nous ne voyons cette astuce que dans l'ancien code, car JavaScript fournit une méthode `.includes` (voir ci-dessous).
355367

0 commit comments

Comments
 (0)