Skip to content

Commit 36ac1ee

Browse files
authored
Merge pull request #259 from Ezechi3l/object_references_and_copying
Object references and copying
2 parents 9be50d6 + bf5baaf commit 36ac1ee

File tree

1 file changed

+72
-72
lines changed

1 file changed

+72
-72
lines changed
Lines changed: 72 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,117 +1,116 @@
1-
# Object references and copying
1+
# Les références d'objet et leur copie
22

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".
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".
44

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.
66

7-
Let's start with a primitive, such as a string.
7+
Commençons avec une primitive, comme une chaîne de caractères.
88

9-
Here we put a copy of `message` into `phrase`:
9+
Ici nous assignons une copie de `message` dans `phrase` :
1010

1111
```js
1212
let message = "Hello!";
1313
let phrase = message;
1414
```
1515

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!"`.
1717

1818
![](variable-copy-value.svg)
1919

20-
Quite an obvious result, right?
20+
Un résultat plutôt évident n'est-ce pas ?
2121

22-
Objects are not like that.
22+
Les objets ne fonctionnent pas comme cela.
2323

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.**
2525

26-
Let's look at an example of such variable:
26+
Prenons un exemple d'une telle variable :
2727

2828
```js
2929
let user = {
3030
name: "John"
3131
};
3232
```
3333

34-
And here's how it's actually stored in memory:
34+
Et ici comment elle est stockée en mémmoire :
3535

3636
![](variable-contains-reference.svg)
3737

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.
3939

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.
4141

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.
4343

44-
Now here's why it's important.
44+
Et voilà pourquoi cela est important.
4545

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é.**
4747

48-
For instance:
48+
Par exemple:
4949

5050
```js no-beautify
5151
let user = { name: "John" };
5252

53-
let admin = user; // copy the reference
53+
let admin = user; // copie la référence
5454
```
5555

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 :
5757

5858
![](variable-copy-reference.svg)
5959

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.
6161

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 :
6363

6464
```js run
6565
let user = { name: 'John' };
6666

6767
let admin = user;
6868

6969
*!*
70-
admin.name = 'Pete'; // changed by the "admin" reference
70+
admin.name = 'Pete'; // changé par la référence "admin"
7171
*/!*
7272

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"
7474
```
7575
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.
7677
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
7879
79-
## Comparison by reference
80+
Deux objets sont egaux seulement s'ils sont le même objet.
8081
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 :
8483
8584
```js run
8685
let a = {};
87-
let b = a; // copy the reference
86+
let b = a; // copie la référence
8887

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
9089
alert( a === b ); // true
9190
```
9291
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) :
9493
9594
```js run
9695
let a = {};
97-
let b = {}; // two independent objects
96+
let b = {}; // 2 objets indépendants
9897

9998
alert( a == b ); // false
10099
```
101100
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.
103102
104-
## Cloning and merging, Object.assign
103+
## Clonage et fusionage, Object.assign
105104
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.
107106
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 ?
109108
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.
111110
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.
113112
114-
Like this:
113+
Comme cela :
115114
116115
```js run
117116
let user = {
@@ -120,59 +119,60 @@ let user = {
120119
};
121120

122121
*!*
123-
let clone = {}; // the new empty object
122+
let clone = {}; // le nouvel object vide
124123

125-
// let's copy all user properties into it
124+
// on copie toutes les propritété de user
126125
for (let key in user) {
127126
clone[key] = user[key];
128127
}
129128
*/!*
130129

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
133132

134-
alert( user.name ); // still John in the original object
133+
alert( user.name ); // c'est toujour john dans l'objet copié
135134
```
136135
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.
138137
139-
The syntax is:
138+
La syntaxe est :
140139
141140
```js
142141
Object.assign(dest, [src1, src2, src3...])
143142
```
144143
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 :
149150
150-
For instance, we can use it to merge several objects into one:
151151
```js
152152
let user = { name: "John" };
153153

154154
let permissions1 = { canView: true };
155155
let permissions2 = { canEdit: true };
156156

157157
*!*
158-
// copies all properties from permissions1 and permissions2 into user
158+
// copie toutes les propriétés de permissions1 et 2 dans user
159159
Object.assign(user, permissions1, permissions2);
160160
*/!*
161161

162-
// now user = { name: "John", canView: true, canEdit: true }
162+
// on a user = { name: "John", canView: true, canEdit: true }
163163
```
164164
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.
166166
167167
```js run
168168
let user = { name: "John" };
169169

170170
Object.assign(user, { name: "Pete" });
171171

172-
alert(user.name); // now user = { name: "Pete" }
172+
alert(user.name); // on a user = { name: "Pete" }
173173
```
174174
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.
176176
177177
```js
178178
let user = {
@@ -185,13 +185,13 @@ let clone = Object.assign({}, user);
185185
*/!*
186186
```
187187
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.
189189
190-
## Nested cloning
190+
## Clonage imbriqué
191191
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à ?
193193
194-
Like this:
194+
Comme ceci :
195195
```js run
196196
let user = {
197197
name: "John",
@@ -204,9 +204,9 @@ let user = {
204204
alert( user.sizes.height ); // 182
205205
```
206206
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` :
208208
209-
Like this:
209+
Comme cela :
210210
211211
```js run
212212
let user = {
@@ -219,21 +219,21 @@ let user = {
219219

220220
let clone = Object.assign({}, user);
221221

222-
alert( user.sizes === clone.sizes ); // true, same object
222+
alert( user.sizes === clone.sizes ); // true, c'est le même objet
223223

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
227227
```
228228
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).
230230
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).
232232
233-
## Summary
233+
## Résumé
234234
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.
236236
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.
238238
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

Comments
 (0)