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/01-getting-started/1-intro/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
@@ -109,11 +109,19 @@ Les outils modernes rendent la [transpilation](https://fr.wiktionary.org/wiki/tr
109
109
110
110
Les exemples de ce genre de langages :
111
111
112
+
<<<<<<< HEAD
112
113
-[CoffeeScript](http://coffeescript.org/) est un "sucre syntaxique" pour JavaScript, il introduit une syntaxe plus courte, permettant d’écrire du code plus précis et plus clair. Habituellement, les développeurs Ruby l'aiment bien.
113
114
-[TypeScript](http://www.typescriptlang.org/) se concentre sur l'ajout de "typage strict des données" pour simplifier le développement et la prise en charge de systèmes complexes. Il est développé par Microsoft.
114
115
-[Flow](http://flow.org/) ajoute également la saisie de données, mais de manière différente. Développé par Facebook.
115
116
-[Dart](https://www.dartlang.org/) est un langage autonome doté de son propre moteur qui s'exécute dans des environnements autres que les navigateurs (comme les applications mobiles). Développé par Google.
116
117
-[Brython](https://brython.info/) est un transpilateur Python vers JavaScript qui permet d'écrire des applications en Python pur sans JavaScript.
118
+
=======
119
+
-[CoffeeScript](http://coffeescript.org/) is a "syntactic sugar" for JavaScript. It introduces shorter syntax, allowing us to write clearer and more precise code. Usually, Ruby devs like it.
120
+
-[TypeScript](http://www.typescriptlang.org/) is concentrated on adding "strict data typing" to simplify the development and support of complex systems. It is developed by Microsoft.
121
+
-[Flow](http://flow.org/) also adds data typing, but in a different way. Developed by Facebook.
122
+
-[Dart](https://www.dartlang.org/) is a standalone language that has its own engine that runs in non-browser environments (like mobile apps), but also can be transpiled to JavaScript. Developed by Google.
123
+
-[Brython](https://brython.info/) is a Python transpiler to JavaScript that enables the writing of applications in pure Python without JavaScript.
124
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
117
125
118
126
Il en existe évidemment bien plus, cela dit, même si nous utilisons un de ces langages, nous devrions également connaître le langage JavaScript, pour bien comprendre ce que nous faisons.
Copy file name to clipboardExpand all lines: 1-js/02-first-steps/04-variables/2-declare-variables/solution.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
@@ -6,7 +6,11 @@ C’est simple :
6
6
let notrePlanete ="Terre";
7
7
```
8
8
9
+
<<<<<<< HEAD
9
10
Notez que nous pourrions utiliser un nom `planète` plus court, mais la planète à laquelle il fait référence pourrait ne pas être évidente. C’est bien d’être plus verbeux. Au moins jusqu'à ce que la variable n'estPasTropLongue.
11
+
=======
12
+
Note, we could use a shorter name `planet`, but it might not be obvious what planet it refers to. It's nice to be more verbose. At least until the variable isNotTooLong.
Copy file name to clipboardExpand all lines: 1-js/02-first-steps/08-operators/article.md
+11Lines changed: 11 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -105,7 +105,18 @@ Cependant, notez que les opérations se déroulent de gauche à droite. S'il y a
105
105
alert(2 + 2 + '1' ); // "41" et non "221"
106
106
```
107
107
108
+
<<<<<<<HEAD
108
109
Ici, les opérateurs travaillent les uns après les autres. Le premier `+` additionne deux nombres, donc il renvoie `4`, puis le `+` suivant ajoute la chaîne `1`, donc c'est comme `4 + '1' = 41`.
110
+
=======
111
+
Here, operators work one after another. The first `+` sums two numbers, so it returns `4`, then the next `+` adds the string `1` to it, so it's like `4 + '1' = 41`.
112
+
113
+
```js run
114
+
alert('1' + 2 + 2); // "122" and not "14"
115
+
```
116
+
Here, the first operand is a string, the compiler treats the other two operands as strings too. The`2` gets concatenated to `'1'`, so it's like `'1' + 2 = "12"` and `"12" + 2 = "122"`.
117
+
118
+
The binary `+` is the only operator that supports strings in such a way. Other arithmetic operators work only with numbers and always convert their operands to numbers.
119
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
109
120
110
121
Le binaire `+` est le seul opérateur qui prend en charge les chaînes de cette manière. D'autres opérateurs arithmétiques ne fonctionnent qu'avec des nombres et convertissent toujours leurs opérandes en nombres.
Copy file name to clipboardExpand all lines: 1-js/03-code-quality/06-polyfills/article.md
+85-5Lines changed: 85 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,5 @@
1
1
2
-
# Polyfills
2
+
# Polyfills and transpilers
3
3
4
4
Le langage JavaScript évolue régulièrement. De nouvelles propositions pour le langage apparaissent régulièrement, elles sont analysées et, si elles sont jugées utiles, elles sont ajoutées à la liste dans <https://tc39.github.io/ecma262/> et ensuite progressent vers la [specification officielle](http://www.ecma-international.org/publications/standards/Ecma-262.htm).
5
5
@@ -9,8 +9,9 @@ Il est donc assez courant pour un moteur de ne mettre en œuvre qu'une partie de
9
9
10
10
Une bonne page pour voir l’état actuel de la prise en charge des fonctionnalités du langage est <https://kangax.github.io/compat-table/es6/> (c’est énorme, nous avons encore beaucoup à étudier).
11
11
12
-
## Babel
12
+
As programmers, we'd like to use most recent features. The more good stuff - the better!
13
13
14
+
<<<<<<< HEAD
14
15
Lorsque nous utilisons des fonctionnalités modernes du langage, certains moteurs peuvent ne pas supporter un tel code. Comme indiqué, toutes les fonctionnalités ne sont pas implémentées partout.
15
16
16
17
C'est là que Babel vient à la rescousse.
@@ -37,15 +38,53 @@ Nous devons donc configurer le transpileur et ajouter le polyfill pour les ancie
37
38
Donc, si nous allons utiliser les fonctionnalités du langage moderne, un transpiler et un polyfill sont nécessaires.
38
39
39
40
## Exemples dans le tutoriel
41
+
=======
42
+
From the other hand, how to make out modern code work on older engines that don't understand recent features yet?
40
43
44
+
There are two tools for that:
41
45
46
+
1. Transpilers.
47
+
2. Polyfills.
48
+
49
+
Here, in this chapter, our purpose is to get the gist of how they work, and their place in web development.
50
+
51
+
## Transpilers
52
+
53
+
A [transpiler](https://en.wikipedia.org/wiki/Source-to-source_compiler) is a special piece of software that can parse ("read and understand") modern code, and rewrite it using older syntax constructs, so that the result would be the same.
54
+
55
+
E.g. JavaScript before year 2020 didn't have the "nullish coalescing operator" `??`. So, if a visitor uses an outdated browser, it may fail to understand the code like `height = height ?? 100`.
56
+
57
+
A transpiler would analyze our code and rewrite `height ?? 100` into `(height !== undefined && height !== null) ? height : 100`.
Now the rewritten code is suitable for older JavaScript engines.
68
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
69
+
70
+
Usually, a developer runs the transpiler on their own computer, and then deploys the transpiled code to the server.
71
+
72
+
<<<<<<< HEAD
42
73
````online
43
74
La plupart des exemples sont exécutables sur place, comme ceci :
75
+
=======
76
+
Speaking of names, [Babel](https://babeljs.io) is one of the most prominent transpilers out there.
77
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
44
78
45
-
```js run
46
-
alert('Press the "Play" button in the upper-right corner to run');
47
-
```
79
+
Modern project build systems, such as [webpack](http://webpack.github.io/), provide means to run transpiler automatically on every code change, so it's very easy to integrate into development process.
80
+
81
+
## Polyfills
82
+
83
+
New language features may include not only syntax constructs and operators, but also built-in functions.
84
+
85
+
For example, `Math.trunc(n)` is a function that "cuts off" the decimal part of a number, e.g `Math.trunc(1.23) =1`.
48
86
87
+
<<<<<<< HEAD
49
88
Les exemples qui utilisent le JS moderne ne fonctionneront que si votre navigateur le prend en charge.
50
89
````
51
90
@@ -55,4 +94,45 @@ Pendant que vous lisez la version hors connexion, les exemples ne sont pas exéc
55
94
56
95
Google Chrome est généralement la version la plus récente des fonctionnalités du langage, il accepte de lancer des démos ultra-sophistiquées sans transpilers, mais les autres navigateurs modernes fonctionnent également très bien.
57
96
97
+
=======
98
+
In some (very outdated) JavaScript engines, there's no `Math.trunc`, so such code will fail.
99
+
100
+
As we're talking about new functions, not syntax changes, there's no need to transpile anything here. We just need to declare the missing function.
101
+
102
+
A script that updates/adds new functions is called "polyfill". It "fills in" the gap and adds missing implementations.
103
+
104
+
For this particular case, the polyfill for `Math.trunc` is a script that implements it, like this:
105
+
106
+
```js
107
+
if (!Math.trunc) { // if no such function
108
+
// implement it
109
+
Math.trunc=function(number) {
110
+
// Math.ceil and Math.floor exist even in ancient JavaScript engines
111
+
// they are covered later in the tutorial
112
+
return number <0?Math.ceil(number) :Math.floor(number);
113
+
};
114
+
}
115
+
```
116
+
117
+
JavaScript is a highly dynamic language, scripts may add/modify any functions, even including built-in ones.
118
+
119
+
Two interesting libraries of polyfills are:
120
+
- [core js](https://github.com/zloirock/core-js) that supports a lot, allows to include only needed features.
121
+
- [polyfill.io](http://polyfill.io) service that provides a script with polyfills, depending on the features and user's browser.
122
+
123
+
124
+
## Summary
125
+
126
+
In this chapter we'd like to motivate you to study modern and even "bleeding-edge" language features, even if they aren't yet well-supported by JavaScript engines.
127
+
128
+
Just don't forget to use transpiler (if using modern syntax or operators) and polyfills (to add functions that may be missing). And they'll ensure that the code works.
129
+
130
+
For example, later when you're familiar with JavaScript, you can setup a code build system based on [webpack](http://webpack.github.io/) with [babel-loader](https://github.com/babel/babel-loader) plugin.
131
+
132
+
Good resources that show the current state of support for various features:
133
+
- <https://kangax.github.io/compat-table/es6/> - for pure JavaScript.
134
+
- <https://caniuse.com/> - for browser-related functions.
135
+
136
+
P.S. Google Chrome is usually the most up-to-date with language features, try it if a tutorial demo fails. Most tutorial demos work with any modern browser though.
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/02-object-copy/article.md
+70Lines changed: 70 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,8 +1,14 @@
1
1
# Les références d'objet et leur copie
2
2
3
+
<<<<<<< HEAD
3
4
Une des différences fondamentale des objets avec les primitives est que ceux-ci sont stockés et copiés "par référence", en opposition des valeurs primitives : strings, numbers, booleans, etc. -- qui sont toujours copiés comme "valeur entière".
4
5
5
6
On comprendra plus facilement en regardant "sous le capot" le fonctionnement de la copie d'une valeur.
7
+
=======
8
+
One of the fundamental differences of objects versus primitives is that objects are stored and copied "by reference", whereas primitive values: strings, numbers, booleans, etc -- are always copied "as a whole value".
9
+
10
+
That's easy to understand if we look a bit under the hood of what happens when we copy a value.
11
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
6
12
7
13
Commençons avec une primitive, comme une chaîne de caractères.
8
14
@@ -13,17 +19,27 @@ let message = "Hello!";
13
19
let phrase = message;
14
20
```
15
21
22
+
<<<<<<< HEAD
16
23
Il en résulte deux variables indépendantes, chacune stockant la chaîne de caractères `"Hello!"`.
24
+
=======
25
+
As a result we have two independent variables, each one storing the string `"Hello!"`.
26
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
17
27
18
28

19
29
20
30
Un résultat plutôt évident n'est-ce pas ?
21
31
22
32
Les objets ne fonctionnent pas comme cela.
23
33
34
+
<<<<<<< HEAD
24
35
**Une variable assignée à un objet ne stocke pas l'objet lui-même, mais son "adresse mémoire", en d'autres termes "une référence" à celui-ci.**
25
36
26
37
Prenons un exemple d'une telle variable :
38
+
=======
39
+
**A variable assigned to an object stores not the object itself, but its "address in memory" -- in other words "a reference" to it.**
40
+
41
+
Let's look at an example of such a variable:
42
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
27
43
28
44
```js
29
45
let user = {
@@ -37,13 +53,23 @@ Et ici comment elle est stockée en mémmoire :
37
53
38
54
L'objet est stocké quelque part dans la mémoire (du coté droit de l'image), tandis que la varaible `user` (du coté gauche) a une référence à celui-ci.
39
55
56
+
<<<<<<< HEAD
40
57
On peut voir la variable d'objet, ici `user`, comme une feuille de papier avec l'adresse.
41
58
42
59
Lorque l'on réalise une action avec l'objet, par exemple récupérer la propriété `user.name`, le moteur de Javascript regarde à l'adresse et réalise l'opération sur l'objet.
60
+
=======
61
+
We may think of an object variable, such as `user`, as like a sheet of paper with the address of the object on it.
62
+
63
+
When we perform actions with the object, e.g. take a property `user.name`, the JavaScript engine looks at what's at that address and performs the operation on the actual object.
64
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
43
65
44
66
Et voilà pourquoi cela est important.
45
67
68
+
<<<<<<< HEAD
46
69
**Lorsqu'une la variable d'objet est copiée -- la référence est copiée, l'objet n'est pas dupliqué.**
70
+
=======
71
+
**When an object variable is copied, the reference is copied, but the object itself is not duplicated.**
72
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
47
73
48
74
Par exemple:
49
75
@@ -53,13 +79,23 @@ let user = { name: "John" };
53
79
let admin = user; // copie la référence
54
80
```
55
81
82
+
<<<<<<< HEAD
56
83
Maintenant nous avons deux variables, chacune avec la référence vers le même objet :
57
84
58
85

59
86
60
87
Comme vous pouvez le voir, il y a toujours qu'un seul objet, avec deux variables qui le référence.
61
88
62
89
On peut utiliser n'importe quelle variable pour accéder à l'objet et modifier le contenu :
90
+
=======
91
+
Now we have two variables, each storing a reference to the same object:
92
+
93
+

94
+
95
+
As you can see, there's still one object, but now with two variables that reference it.
96
+
97
+
We can use either variable to access the object and modify its contents:
98
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
63
99
64
100
```js run
65
101
let user = { name:'John' };
@@ -73,7 +109,11 @@ admin.name = 'Pete'; // changé par la référence "admin"
73
109
alert(*!*user.name*/!*); //'Pete', les changements sont visibles sur la référence "user"
74
110
```
75
111
112
+
<<<<<<< HEAD
76
113
C'est comme si l'on avait un cabinet avec deux clés et que on l'on utilisait l'une d'elles (`admin`) pour y accéder. Puis, si l'on utilise plus tard la clé (`user`) on peut voir les changements.
114
+
=======
115
+
It's as if we had a cabinet with two keys and used one of them (`admin`) to get into it and make changes. Then, if we later use another key (`user`), we are still opening the same cabinet and can access the changed contents.
116
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
77
117
78
118
## Comparaison par référence
79
119
@@ -98,15 +138,23 @@ let b = {}; // 2 objets indépendants
98
138
alert( a == b ); // false
99
139
```
100
140
141
+
<<<<<<< HEAD
101
142
Pour des comparaisons comme `obj1 > obj2` ou des comparaisons avec une primitive `obj ==5`, les objets sont convertis en primitive. Nous étudierons comment les conversions d'objets fonctionnent bientôt, mais pour dire la vérité, de telles comparaisons sont rarement nécessaires, en général elles sont le résultat d'une erreur de programmation.
143
+
=======
144
+
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.
145
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
102
146
103
147
## Clonage et fusionage, Object.assign
104
148
105
149
Copier une variable object créé une référence en plus vers le même objet.
106
150
107
151
Mais quid si nous voulons dupliquer un objet ? Créer une copie indépendante, un clone ?
108
152
153
+
<<<<<<< HEAD
109
154
C'est aussi faisable, mais un peu plus compliqué, car en Javascript il n'y pas de méthode intégrée pour cela. En fait c'est rarement utile. Copier par référence fonctionne la plupart du temps.
155
+
=======
156
+
That's also doable, but a little bit more difficult, because there's no built-in method for that in JavaScript. But there is rarely a need -- copying by reference is good most of the time.
157
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
110
158
111
159
Mais si nous le voulons, alors nous devons créer un nouvel objet et répliquer sa structure en itérant ses propriétés et en les copiant au niveau primitive.
112
160
@@ -226,12 +274,21 @@ user.sizes.width++; // on modifie la propriété à un endroit
226
274
alert(clone.sizes.width); // 51, on peut voir la modification dans un autre endroit
227
275
```
228
276
277
+
<<<<<<< HEAD
229
278
Pour régler ça, on doit utiliser la boucle de clonage qui examine chaque valeur de `user[key]` et, si c'est un objet, répliquer sa structure aussi. On appelle cela un "clone réél" (deep clone).
230
279
231
280
On peut utiliser la récursion pour l'implémenter. Ou, pour ne pas réinventer la roue, prendre un implémentation existante. par exemple [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) de la librairie [lodash](https://lodash.com).
232
281
233
282
```smart header="Les objets Const peuvent être modifiés"
234
283
Un "effet secondaire" important du stockage d'objets en tant que références est qu'un objet déclaré comme `const`*peut* être modifié.
284
+
=======
285
+
To fix that, we should use a cloning loop that examines each value of`user[key]` and, if it's an object, then replicate its structure as well. That is called a "deep cloning".
286
+
287
+
We can use recursion to implement it. Or, to not reinvent the wheel, take an existing implementation, for instance [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) from the JavaScript library [lodash](https://lodash.com).
288
+
289
+
````smart header="Const objects can be modified"
290
+
An important side effect of storing objects as references is that an object declared as `const` *can* be modified.
291
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
235
292
236
293
Par exemple :
237
294
@@ -247,16 +304,29 @@ user.name = "Pete"; // (*)
247
304
alert(user.name); // Pete
248
305
```
249
306
307
+
<<<<<<< HEAD
250
308
Il peut sembler que la ligne `(*)` provoquerait une erreur, mais non. La valeur de `user` est constante, elle doit toujours référencer le même objet. Mais les propriétés de cet objet sont libres de changer.
251
309
252
310
En d'autres termes, le `const user` ne donne une erreur que si nous essayons de définir `user = ...` dans son ensemble, et c'est tout.
253
311
254
312
Cela dit, si nous avons vraiment besoin de créer des propriétés d'objet constantes, c'est également possible, mais en utilisant des méthodes totalement différentes, nous le mentionnerons dans le chapitre <info:property-descriptors>.
255
313
```
314
+
=======
315
+
It might seem that the line `(*)` would cause an error, but it does not. The value of `user` is constant, it must always reference the same object, but properties of that object are free to change.
316
+
317
+
In other words, the `const user` gives an error only if we try to set `user=...` as a whole.
318
+
319
+
That said, if we really need to make constant object properties, it's also possible, but using totally different methods. We'll mention that in the chapter <info:property-descriptors>.
320
+
````
321
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
256
322
257
323
## Résumé
258
324
325
+
<<<<<<< HEAD
259
326
Les objets sont assignés et copiés par référence. En d'autres mots, une variable ne stocke pas la "valeur de l'objet" mais la "référence" (l'adresse en mémoire) de la valeur. Donc copier cette variable, ou la passer en argument d'une fonction, copie la référence, pas l'objet.
327
+
=======
328
+
Objects are assigned and copied by reference. In other words, a variable stores not the "object value", but a "reference" (address in memory) for the value. So copying such a variable or passing it as a function argument copies that reference, not the object itself.
329
+
>>>>>>> 13da056653754765b50aa5a9f706f84a4a0d6293
260
330
261
331
Toutes les opérations faites par une copie de la référence (comme ajouter/supprimer une propriété) sont faites sur le même objet.
0 commit comments