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
@@ -37,11 +37,7 @@ Et ici comment elle est stockée en mémoire :
37
37
38
38
L'objet est stocké quelque part dans la mémoire (du coté droit de l'image), tandis que la variable `user` (du coté gauche) a une référence à celui-ci.
39
39
40
-
<<<<<<< HEAD
41
40
On peut imaginer la variable d'objet, ici `user`, comme une feuille de papier avec l'adresse de l'objet écrit dessus.
42
-
=======
43
-
We may think of an object variable, such as `user`, like a sheet of paper with the address of the object on it.
44
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
45
41
46
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 actuel.
47
43
@@ -104,13 +100,10 @@ alert( a == b ); // false
104
100
105
101
Pour des comparaisons comme `obj1 > obj2` ou des comparaisons avec une primitive `obj ==5`, les objets sont convertis en primitives. Nous étudierons comment les conversions d'objets fonctionnent très 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.
106
102
107
-
<<<<<<< HEAD
108
-
## Clonage et fusion, Object.assign [#clonage-et-fusion-object-assign]
109
-
=======
110
-
````smart header="Const objects can be modified"
111
-
An important side effect of storing objects as references is that an object declared as `const` *can* bemodified.
103
+
````smart header="Les objets const peuvent être modifiés"
104
+
Un effet secondaire important du stockage des objets en tant que références est qu'un objet déclaré comme `const` *peut* êtremodifié.
112
105
113
-
For instance:
106
+
Par exemgle :
114
107
115
108
```js run
116
109
const user = {
@@ -124,29 +117,20 @@ user.name = "Pete"; // (*)
124
117
alert(user.name); // Pete
125
118
```
126
119
127
-
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.
120
+
Il peut sembler que la ligne`(*)`causerait une erreur, mais ce n'est pas le cas. 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.
128
121
129
-
In other words, the `const user`gives an error only if we try to set`user=...`as a whole.
122
+
En d'autres termes, `const user`donne une erreur uniquement si nous essayons de définir`user=...`dans son ensemble.
130
123
131
-
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>.
124
+
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>.
132
125
````
133
126
134
-
## Cloning and merging, Object.assign [#cloning-and-merging-object-assign]
135
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
127
+
## Clonage et fusion, Object.assign [#cloning-and-merging-object-assign]
136
128
137
129
Copier une variable object créé une référence en plus vers le même objet.
138
130
139
-
<<<<<<<HEAD
140
-
Mais quid si nous voulons dupliquer un objet ? Créer une copie indépendante, un clone ?
131
+
Mais que se passe-t-il si nous devons dupliquer un objet ?
141
132
142
-
C'est aussi faisable, mais un peu plus compliqué, parce qu'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.
143
-
144
-
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.
145
-
=======
146
-
But what if we need to duplicate an object?
147
-
148
-
We can create a newobject and replicate the structure of the existing one, by iterating over its properties and copying them on the primitive level.
149
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
133
+
Nous pouvons créer un nouvel objet et reproduire la structure de l'existant, en itérant sur ses propriétés et en les copiant au niveau primitif.
150
134
151
135
Comme cela :
152
136
@@ -171,11 +155,7 @@ clone.name = "Pete"; // On change les données de celui-ci
171
155
alert( user.name ); // c'est toujour john dans l'objet copié
172
156
```
173
157
174
-
<<<<<<<HEAD
175
-
On peut aussi utiliser la méthode [Object.assign](mdn:js/Object/assign) pour cela.
176
-
=======
177
-
We can also use the method [Object.assign](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign).
178
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
158
+
On peut aussi utiliser la méthode [Object.assign](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) pour cela.
179
159
180
160
181
161
La syntaxe est :
@@ -184,25 +164,14 @@ La syntaxe est :
184
164
Object.assign(dest, ...sources)
185
165
```
186
166
187
-
<<<<<<<HEAD
188
167
- Le premier argument `dest` est l'objet cible
189
-
- Les arguments suivants `src1, ..., srcN` (cela peut-être tant que l'on veut) sont les objets à copier.
190
-
- La méthode copie les propriétés de tous 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.
191
-
-L'appel retourne `dest`.
192
-
193
-
Par exemple, on peut l'utiliser pour fusionner plusieurs objets en un seul :
194
-
195
-
```js
196
-
=======
197
-
- The first argument `dest` is a target object.
198
-
- Further arguments is a list of source objects.
168
+
- Les autres arguments sont une liste d'objets source.
199
169
200
-
It copies the properties of all source objects into the target `dest`, and then returns it as the result.
170
+
Il copie les propriétés de tous les objets sources dans la cible `dest`, puis les renvoie comme résultat.
201
171
202
-
For example, we have `user` object, let's add a couple of permissions to it:
172
+
Par exemple, nous avons l'objet `user`, ajoutons-lui quelques autorisations :
On peut aussi utiliser `Object.assign` pour remplacer la boucle `for..in` pour un clonage simple.
238
-
=======
239
-
We also can use `Object.assign` to perform a simple object cloning:
240
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
201
+
Nous pouvons également utiliser `Object.assign` pour effectuer un simple clonage d'objet :
241
202
242
203
```js run
243
204
let user = {
@@ -253,21 +214,13 @@ alert(clone.name); // John
253
214
alert(clone.age); // 30
254
215
```
255
216
256
-
<<<<<<< HEAD
257
-
Cela copie toutes les propriétés de `user` dans l'objet vide et le retourne.
258
-
=======
259
-
Here it copies all properties of `user` into the empty object and returns it.
260
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
217
+
Ici cela copie toutes les propriétés de `user` dans l'objet vide et le retourne.
261
218
262
219
Il existe également d'autres méthodes de clonage d'un objet, par ex. en utilisant la [syntaxe spread](info:rest-parameters-spread) `clone = {...user}`, abordé plus loin dans le tutoriel.
263
220
264
221
## Clonage imbriqué
265
222
266
-
<<<<<<< HEAD
267
223
Jusqu'à maintenant on suppose que toutes les propriétés de `user` sont des primitives. Mais les propriétés peuvent être des références vers d'autres objets. Comment gèrer ces cas-là ?
268
-
=======
269
-
Until now we assumed that all properties of `user` are primitive. But properties can be references to other objects.
270
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
271
224
272
225
Comme ceci :
273
226
```js run
@@ -282,13 +235,8 @@ let user = {
282
235
alert( user.sizes.height ); // 182
283
236
```
284
237
285
-
<<<<<<< HEAD
286
238
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` :
287
239
288
-
Comme cela :
289
-
=======
290
-
Now it's not enough to copy `clone.sizes=user.sizes`, because `user.sizes` is an object, and will be copied by reference, so `clone` and `user` will share the same sizes:
291
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
292
240
293
241
```js run
294
242
let user = {
@@ -303,36 +251,19 @@ let clone = Object.assign({}, user);
303
251
304
252
alert( user.sizes === clone.sizes ); // true, c'est le même objet
305
253
306
-
<<<<<<<HEAD
307
254
// user et clone partage l'objet sizes
308
-
user.sizes.width++; // on modifie la propriété à un endroit
309
-
alert(clone.sizes.width); // 51, on peut voir la modification dans un autre endroit
310
-
```
311
-
312
-
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éel" (deep clone).
313
-
314
-
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).
315
-
316
-
```smart header="Les objets Const peuvent être modifiés"
317
-
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é.
318
-
```
319
-
320
-
Par exemple :
321
-
=======
322
-
// user and clone share sizes
323
-
user.sizes.width = 60; // change a property from one place
324
-
alert(clone.sizes.width); // 60, get the result from the other one
255
+
user.sizes.width=60; // changer une propriété d'un endroit
256
+
alert(clone.sizes.width); // 60, obtenir le résultat de l'autre
325
257
```
326
258
327
-
To fix that and make `user`and`clone`truly separate objects, 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" or "structured cloning". There's [structuredClone](https://developer.mozilla.org/en-US/docs/Web/API/structuredClone) method that implements deep cloning.
259
+
Pour résoudre ce problème et faire en sorte que `user`et`clone`soient des objets véritablement séparés, nous devrions utiliser une boucle de clonage qui examine chaque valeur de `user[key]`et, s'il s'agit d'un objet, répliquer également sa structure. C'est ce qu'on appelle un « clonage profond » ou « clonage structuré ». Il existe une méthode [structuredClone](https://developer.mozilla.org/en-US/docs/Web/API/structuredClone) qui implémente le clonage en profondeur.
328
260
329
261
330
262
### structuredClone
331
263
332
-
The call `structuredClone(object)`clones the `object`with all nested properties.
264
+
L'appel `structuredClone(object)`clone l'`object`avec toutes les propriétés imbriquées.
333
265
334
-
Here's how we can use it in our example:
335
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
266
+
Voici comment nous pouvons l'utiliser dans notre exemple :
336
267
337
268
```js run
338
269
let user = {
@@ -354,35 +285,27 @@ user.sizes.width = 60; // change a property from one place
354
285
alert(clone.sizes.width); // 50, not related
355
286
```
356
287
357
-
<<<<<<< HEAD
358
-
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.
288
+
La méthode `structuredClone` peut cloner la plupart des types de données, tels que des objets, des tableaux, des valeurs primitives.
359
289
360
-
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.
290
+
Il prend également en charge les références circulaires, lorsqu'une propriété d'objet fait référence à l'objet lui-même (directement ou via une chaîne ou des références).
361
291
362
-
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>.
363
-
364
-
=======
365
-
The `structuredClone` method can clone most data types, such as objects, arrays, primitive values.
366
-
367
-
It also supports circular references, when an object property references the object itself (directly or via a chain or references).
368
-
369
-
For instance:
292
+
Par exemple :
370
293
371
294
```js run
372
295
let user = {};
373
-
// let's create a circular reference:
374
-
// user.me references the user itself
296
+
//créons une référence circulaire :
297
+
// user.me fait référence à l'utilisateur lui-même
375
298
user.me= user;
376
299
377
300
let clone =structuredClone(user);
378
301
alert(clone.me=== clone); // true
379
302
```
380
303
381
-
As you can see, `clone.me`references the `clone`, not the`user`! So the circular reference was cloned correctly as well.
304
+
Comme vous pouvez le voir, `clone.me`fait référence au `clone`, pas à`user` ! Ainsi, la référence circulaire a également été clonée correctement.
382
305
383
-
Although, there are cases when `structuredClone`fails.
306
+
Cependant, il existe des cas où `structuredClone`échoue.
384
307
385
-
For instance, when an object has a function property:
308
+
Par exemple, lorsqu'un objet a une propriété de fonction :
386
309
387
310
```js run
388
311
// error
@@ -391,19 +314,14 @@ structuredClone({
391
314
});
392
315
```
393
316
394
-
Function properties aren't supported.
317
+
Les propriétés de fonction ne sont pas prises en charge.
395
318
396
-
To handle such complex cases we may need to use a combination of cloning methods, write custom code 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).
397
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
319
+
Pour gérer des cas aussi complexes, nous devrons peut-être utiliser une combinaison de méthodes de clonage, écrire du code personnalisé ou, pour ne pas réinventer la roue, prendre une implémentation existante, par exemple [_.cloneDeep(obj)](https://lodash.com /docs#cloneDeep) de la bibliothèque JavaScript [lodash](https://lodash.com).
398
320
399
321
## Résumé
400
322
401
323
Les objets sont assignés et copiés par référence. En d'autres termes, 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 lui-même.
402
324
403
325
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.
404
326
405
-
<<<<<<< HEAD
406
-
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).
407
-
=======
408
-
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 `structuredClone` or use a custom cloning implementation, such as [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep).
409
-
>>>>>>> bf7d8bb1af3b416d393af1c15b03cb1352da1f9c
327
+
Pour faire une "copie réelle" (un clone), nous pouvons utiliser `Object.assign` pour la soi-disant "copie superficielle" (les objets imbriqués sont copiés par référence) ou une fonction de "clonage en profondeur" `structuredClone` ou utiliser une implementation personnalisée de clonage, telle que [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep).
0 commit comments