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
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".
3
+
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
4
5
-
That's easy to understand if we look a bit "under a cover" of what happens when we copy a value.
5
+
On comprendra plus facilement en regardant "sous le capot" le fonctionnement de la copie d'une valeur.
6
6
7
-
Let's start with a primitive, such as a string.
7
+
Commençons avec une primitive, comme une chaîne de caractères.
8
8
9
-
Here we put a copy of`message`into`phrase`:
9
+
Ici nous assignons une copie de`message`dans`phrase`:
10
10
11
11
```js
12
12
let message ="Hello!";
13
13
let phrase = message;
14
14
```
15
15
16
-
As a result we have two independent variables, each one is storing the string`"Hello!"`.
16
+
Il en résulte deux variables indépendantes, chacune stockant la chaîne de caractères`"Hello!"`.
17
17
18
18

19
19
20
-
Quite an obvious result, right?
20
+
Un résultat plutôt évident n'est-ce pas ?
21
21
22
-
Objects are not like that.
22
+
Les objets ne fonctionnent pas comme cela.
23
23
24
-
**A variable assigned to an object stores not the object itself, but its "address in memory", in other words "a reference" to it.**
24
+
**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
25
26
-
Let's look at an example of such variable:
26
+
Prenons un exemple d'une telle variable:
27
27
28
28
```js
29
29
let user = {
30
30
name:"John"
31
31
};
32
32
```
33
33
34
-
And here's how it's actually stored in memory:
34
+
Et ici comment elle est stockée en mémmoire :
35
35
36
36

37
37
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.
38
+
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
39
40
-
We may think of an object variable, such as `user`, as of a sheet of paper with the address.
40
+
On peut voir la variable d'objet, ici `user`, comme une feuille de papier avec l'adresse.
41
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.
42
+
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.
43
43
44
-
Now here's why it's important.
44
+
Et voilà pourquoi cela est important.
45
45
46
-
**When an object variable is copied -- the reference is copied, the object is not duplicated.**
46
+
**Lorsqu'une la variable d'objet est copiée -- la référence est copiée, l'objet n'est pas dupliqué.**
47
47
48
-
For instance:
48
+
Par exemple:
49
49
50
50
```js no-beautify
51
51
let user = { name:"John" };
52
52
53
-
let admin = user; //copy the reference
53
+
let admin = user; //copie la référence
54
54
```
55
55
56
-
Now we have two variables, each one with the reference to the same object:
56
+
Maintenant nous avons deux variables, chacune avec la référence vers le même objet :
57
57
58
58

59
59
60
-
As you can see, there's still one object, now with two variables that reference it.
60
+
Comme vous pouvez le voir, il y a toujours qu'un seul objet, avec deux variables qui le référence.
61
61
62
-
We can use any variable to access the object and modify its contents:
62
+
On peut utiliser n'importe quelle variable pour accéder à l'objet et modifier le contenu :
63
63
64
64
```js run
65
65
let user = { name:'John' };
66
66
67
67
let admin = user;
68
68
69
69
*!*
70
-
admin.name='Pete'; //changed by the "admin" reference
70
+
admin.name='Pete'; //changé par la référence "admin"
71
71
*/!*
72
72
73
-
alert(*!*user.name*/!*); //'Pete', changes are seen from the "user" reference
73
+
alert(*!*user.name*/!*); //'Pete', les changements sont visibles sur la référence "user"
74
74
```
75
75
76
+
C'est comme si l'on avait un cabinet avec deux clés et que on l'on utilisait l'un d'elles (`admin`) pour y accéder. Puis, si l'on utilise plus tard la clé (`user`) on peut voir les changements.
76
77
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.
78
+
## Comparaison par référence
78
79
79
-
## Comparison by reference
80
+
Deux objets sont egaux seulement s'ils sont le même objet.
80
81
81
-
Two objects are equal only if they are the same object.
82
-
83
-
For instance, here `a` and `b` reference the same object, thus they are equal:
82
+
Par exemple, ici `a` et `b` référence le même objet, aussi sont-ils similaires :
84
83
85
84
```js run
86
85
let a = {};
87
-
let b = a; //copy the reference
86
+
let b = a; //copie la référence
88
87
89
-
alert( a == b ); // true, both variables reference the same object
88
+
alert( a == b ); // true, les deux variables référencent le même objet
90
89
alert( a === b ); // true
91
90
```
92
91
93
-
And here two independent objects are not equal, even though they look alike (both are empty):
92
+
Et ici deux objets indépendants ne sont pas égaux, même s'ils se ressemblent (les deux sont vides) :
94
93
95
94
```js run
96
95
let a = {};
97
-
let b = {}; //two independent objects
96
+
let b = {}; //2 objets indépendants
98
97
99
98
alert( a == b ); // false
100
99
```
101
100
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.
101
+
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.
103
102
104
-
## Cloning and merging, Object.assign
103
+
## Clonage et fusionage, Object.assign
105
104
106
-
So, copying an object variable creates one more reference to the same object.
105
+
Copier une variable object créé une référence en plus vers le même objet.
107
106
108
-
But what if we need to duplicate an object? Create an independent copy, a clone?
107
+
Mais quid si nous voulons dupliquer un objet ? Créer une copie indépendante, un clone?
109
108
110
-
That's also doable, but a little bit more difficult, because there's no built-in method for that in JavaScript. Actually, that's rarely needed. Copying by reference is good most of the time.
109
+
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.
111
110
112
-
But if we really want that, then we need to create a new object and replicate the structure of the existing one by iterating over its properties and copying them on the primitive level.
111
+
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.
113
112
114
-
Like this:
113
+
Comme cela :
115
114
116
115
```js run
117
116
let user = {
@@ -120,59 +119,60 @@ let user = {
120
119
};
121
120
122
121
*!*
123
-
let clone = {}; //the new empty object
122
+
let clone = {}; //le nouvel object vide
124
123
125
-
//let's copy all user properties into it
124
+
//on copie toutes les propritété de user
126
125
for (let key in user) {
127
126
clone[key] = user[key];
128
127
}
129
128
*/!*
130
129
131
-
//now clone is a fully independent object with the same content
132
-
clone.name="Pete"; //changed the data in it
130
+
//maintenant clone est un objet complétemnet indépendant avec le même contenu
131
+
clone.name="Pete"; //On change les données de celui-ci
133
132
134
-
alert( user.name ); //still John in the original object
133
+
alert( user.name ); //c'est toujour john dans l'objet copié
135
134
```
136
135
137
-
Also we can use the method [Object.assign](mdn:js/Object/assign) for that.
136
+
On peu aussi utiliser la méthode [Object.assign](mdn:js/Object/assign) pour cela.
138
137
139
-
The syntax is:
138
+
La syntaxe est :
140
139
141
140
```js
142
141
Object.assign(dest, [src1, src2, src3...])
143
142
```
144
143
145
-
- The first argument `dest` is a target object.
146
-
- Further arguments `src1, ..., srcN` (can be as many as needed) are source objects.
147
-
- It copies the properties of all source objects `src1, ..., srcN` into the target `dest`. In other words, properties of all arguments starting from the second are copied into the first object.
148
-
- The call returns `dest`.
144
+
- Le premier argument `dest` est l'objet cible
145
+
- Les arguments suivants `src1, ..., srcN` (cela peut-être tant que l'on veut) sont les objets à copier.
146
+
- La méthode copie les propriétés de toutes les objets à copier `src1, ..., srcN` dans l'objet `dest`. En d'autres mots, les propriétés de tous les arguments à partir du deuxième sont copiés dans le premier argument.
147
+
- L'appel retourne `dest`.
148
+
149
+
Par exemple, on peut l'utiliser pour fusioner plusieurs objets en un seul :
149
150
150
-
For instance, we can use it to merge several objects into one:
151
151
```js
152
152
let user = { name:"John" };
153
153
154
154
let permissions1 = { canView:true };
155
155
let permissions2 = { canEdit:true };
156
156
157
157
*!*
158
-
//copies all properties from permissions1 and permissions2 into user
158
+
//copie toutes les propriétés de permissions1 et 2 dans user
//on a user = { name: "John", canView: true, canEdit: true }
163
163
```
164
164
165
-
If the copied property name already exists, it gets overwritten:
165
+
Si la propriété copiée existe déja, elle est écrasée.
166
166
167
167
```js run
168
168
let user = { name:"John" };
169
169
170
170
Object.assign(user, { name:"Pete" });
171
171
172
-
alert(user.name); //now user = { name: "Pete" }
172
+
alert(user.name); //on a user = { name: "Pete" }
173
173
```
174
174
175
-
We also can use`Object.assign` to replace `for..in`loop for simple cloning:
175
+
On peut aussi utiliser`Object.assign` to replace `for..in`boucle pour un clonage simple.
176
176
177
177
```js
178
178
let user = {
@@ -185,13 +185,13 @@ let clone = Object.assign({}, user);
185
185
*/!*
186
186
```
187
187
188
-
It copies all properties of `user`into the empty object and returns it.
188
+
Cela copie toutes les propriétés de `user`dans l'objet vide et le retourne.
189
189
190
-
## Nested cloning
190
+
## Clonage imbriqué
191
191
192
-
Until now we assumed that all properties of `user` are primitive. But properties can be references to other objects. What to do with them?
192
+
Jusqu'à maintenat on suppose que toutes les propriétés de `use` sont des primitives. Mais les propriétés peuvent être des références vers d'autres objets. Comment gèrer ces cas-là ?
193
193
194
-
Like this:
194
+
Comme ceci :
195
195
```js run
196
196
let user = {
197
197
name:"John",
@@ -204,9 +204,9 @@ let user = {
204
204
alert( user.sizes.height ); // 182
205
205
```
206
206
207
-
Now it's not enough to copy`clone.sizes=user.sizes`, because the `user.sizes`is an object, it will be copied by reference. So`clone`and`user`will share the same sizes:
207
+
Ce n'est plus suffisant de copier`clone.sizes=user.sizes`, car `user.sizes`est un objet, il sera copié par référence. Donc`clone`et`user`partageront le même objet `sizes`:
208
208
209
-
Like this:
209
+
Comme cela :
210
210
211
211
```js run
212
212
let user = {
@@ -219,21 +219,21 @@ let user = {
219
219
220
220
let clone =Object.assign({}, user);
221
221
222
-
alert( user.sizes===clone.sizes ); // true, same object
222
+
alert( user.sizes===clone.sizes ); // true, c'est le même objet
223
223
224
-
// user and clone share sizes
225
-
user.sizes.width++; //change a property from one place
226
-
alert(clone.sizes.width); // 51, see the result from the other one
224
+
// user et clone partage l'objet sizes
225
+
user.sizes.width++; //on modifie la propriété à un endroit
226
+
alert(clone.sizes.width); // 51, on peut voir la modification dans un autre endroit
227
227
```
228
228
229
-
To fix that, we should use the 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".
229
+
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
230
231
-
We can use recursion to implement it. Or, not to reinvent the wheel, take an existing implementation, for instance [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) from the JavaScript library [lodash](https://lodash.com).
231
+
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
232
233
-
## Summary
233
+
## Résumé
234
234
235
-
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.
235
+
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.
236
236
237
-
All operations via copied references (like adding/removing properties) are performed on the same single object.
237
+
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.
238
238
239
-
To make a "real copy" (a clone) we can use`Object.assign` for the so-called "shallow copy" (nested objects are copied by reference) or a "deep cloning" function, such as [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep).
239
+
Pour réaliser une copie (un clone) on peut utiliser`Object.assign`, pour faire une "copie superficielle" (les objets imbriqués sont copiés par référence), ou pour une "copie réelle" une fonction comme [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep).
0 commit comments