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", whereas primitive values: strings, numbers, booleans, etc -- are always copied "as a whole value".
3
+
Einer der grundlegenden Unterschiede zwischen Objekten und primitiven Werten besteht darin, dass Objekte "per Referenz" gespeichert und kopiert werden, während primitive Werte wie Strings, Zahlen, Booleans usw. immer als "vollständiger Wert" kopiert werden.
4
4
5
-
That's easy to understand if we look a bit under the hood of what happens when we copy a value.
5
+
Das ist leicht zu verstehen, wenn wir uns ansehen, was beim Kopieren eines Wertes passiert.
6
6
7
-
Let's start with a primitive, such as a string.
7
+
Beginnen wir mit einem primitiven Wert, wie einem String.
8
8
9
-
Here we put a copy of `message`into`phrase`:
9
+
Hier kopieren wir `message`nach`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 storing the string`"Hello!"`.
16
+
Als Ergebnis haben wir zwei unabhängige Variablen, jede speichert den String`"Hello!"`.
17
17
18
18

19
19
20
-
Quite an obvious result, right?
20
+
Ein ziemlich offensichtliches Ergebnis, oder?
21
21
22
-
Objects are not like that.
22
+
Bei Objekten ist das nicht so.
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
+
**Eine Variablenzuweisung mit einem Objekt speichert nicht das Objekt selbst, sondern seine "Adresse im Speicher" -- anders ausgedrückt "eine Referenz" darauf.**
25
25
26
-
Let's look at an example of such a variable:
26
+
Sehen wir uns ein Beispiel einer solchen Variable an:
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
+
Und so wird es tatsächlich im Speicher abgelegt:
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
+
Das Objekt wird irgendwo im Speicher abgelegt (rechts im Bild), während die`user`-Variable (links) eine "Referenz" darauf hat.
39
39
40
-
We may think of an object variable, such as `user`, like a sheet of paper with the address of the object on it.
40
+
Wir können uns eine Objektvariable wie `user` als ein Blatt Papier vorstellen, auf dem die Adresse des Objekts steht.
41
41
42
-
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.
42
+
Wenn wir Aktionen mit dem Objekt durchführen, z.B. eine Eigenschaft `user.name` anfordern, schaut die JavaScript-Engine nach, was sich an dieser Adresse befindet und führt die Operation am eigentlichen Objekt durch.
43
43
44
-
Now here's why it's important.
44
+
Nun hier ist, warum das wichtig ist.
45
45
46
-
**When an object variable is copied, the reference is copied, but the object itself is not duplicated.**
46
+
**Wenn eine Objektvariable kopiert wird, wird die Referenz kopiert, aber das Objekt selbst wird nicht dupliziert.**
47
47
48
-
For instance:
48
+
Zum Beispiel:
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; //kopiere die Referenz
54
54
```
55
55
56
-
Now we have two variables, each storing a reference to the same object:
56
+
Jetzt haben wir zwei Variablen, jede speichert eine Referenz auf dasselbe Objekt:
57
57
58
58

59
59
60
-
As you can see, there's still one object, but now with two variables that reference it.
60
+
Wie du sehen kannst, gibt es immer noch nur ein Objekt, aber jetzt mit zwei Variablen, die darauf verweisen.
61
61
62
-
We can use either variable to access the object and modify its contents:
62
+
Wir können entweder die Variable verwenden, um auf das Objekt zuzugreifen und dessen Inhalt zu ändern:
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'; //geändert durch die "admin"-Referenz
71
71
*/!*
72
72
73
-
alert(*!*user.name*/!*); //'Pete', changes are seen from the "user" reference
73
+
alert(*!*user.name*/!*); //'Pete', Änderungen sind von der "user"-Referenz aus sichtbar
74
74
```
75
75
76
-
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.
76
+
Es ist, als hätten wir einen Schrank mit zwei Schlüsseln und benutzen einen davon (`admin`), um hineinzukommen und Änderungen vorzunehmen. Dann, wenn wir später einen anderen Schlüssel (`user`) benutzen, öffnen wir immer noch denselben Schrank und können auf den geänderten Inhalt zugreifen.
77
77
78
-
## Comparison by reference
78
+
## Vergleich per Referenz
79
79
80
-
Two objects are equal only if they are the same object.
80
+
Zwei Objekte sind nur dann gleich, wenn sie dasselbe Objekt sind.
81
81
82
-
For instance, here `a`and`b`reference the same object, thus they are equal:
82
+
Zum Beispiel sind hier `a`und`b`Referenzen auf dasselbe Objekt, also sind sie gleich:
83
83
84
84
```js run
85
85
let a = {};
86
-
let b = a; //copy the reference
86
+
let b = a; //kopiere die Referenz
87
87
88
-
alert( a == b ); //true, both variables reference the same object
89
-
alert( a === b ); //true
88
+
alert( a == b ); //wahr, beide Variablen verweisen auf dasselbe Objekt
89
+
alert( a === b ); //wahr
90
90
```
91
91
92
-
And here two independent objects are not equal, even though they look alike (both are empty):
92
+
Und hier sind zwei unabhängige Objekte nicht gleich, auch wenn sie gleich aussehen (beide sind leer):
93
93
94
94
```js run
95
95
let a = {};
96
-
let b = {}; //two independent objects
96
+
let b = {}; //zwei unabhängige Objekte
97
97
98
-
alert( a == b ); //false
98
+
alert( a == b ); //falsch
99
99
```
100
100
101
-
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
+
Für Vergleiche wie`obj1 > obj2`oder für einen Vergleich mit einem primitiven Wert `obj ==5` werden Objekte in primitive Werte umgewandelt. Wir werden bald untersuchen, wie Objektumwandlungen funktionieren, aber um ehrlich zu sein, solche Vergleiche werden sehr selten benötigt -- normalerweise treten sie als Ergebnis eines Programmierfehlers auf.
102
102
103
-
````smart header="Const objects can be modified"
104
-
An important side effect of storing objects as references is that an object declared as `const` *can* bemodified.
103
+
````smart header="Const-Objekte können verändert werden"
104
+
Eine wichtige Nebenwirkung der Speicherung von Objekten als Referenzen ist, dass ein `const` deklariertesObjektverändertwerdenkann.
105
105
106
-
For instance:
106
+
Zum Beispiel:
107
107
108
108
```js run
109
109
const user = {
@@ -117,22 +117,22 @@ user.name = "Pete"; // (*)
117
117
alert(user.name); // Pete
118
118
```
119
119
120
-
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
+
Es mag scheinen, dass die Zeile`(*)`einen Fehler verursacht, aber das tut sie nicht. Der Wert von`user`ist konstant, dieser muss immer auf dasselbe Objekt verweisen, aber Eigenschaften dieses Objekts können sich ändern.
121
121
122
-
In other words, the`const user`gives an error only if we try to set `user=...`as a whole.
122
+
Anders ausgedrückt, die`const user`verursacht nur dann einen Fehler, wenn wir versuchen `user=...`als ganzes zu setzen.
123
123
124
-
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
+
Das heißt aber auch, wenn wir wirklich konstante Objekteigenschaften benötigen, ist das auch möglich, jedoch mit völlig anderen Methoden. Das werden wir im Kapitel <info:property-descriptors> erwähnen.
125
125
````
126
126
127
-
## Cloning and merging, Object.assign [#cloning-and-merging-object-assign]
127
+
## Klonen und Zusammenfügen, Object.assign [#cloning-and-merging-object-assign]
128
128
129
-
So, copying an object variable creates one more reference to the same object.
129
+
Das Kopieren einer Objektvariablen schafft also eine weitere Referenz auf dasselbe Objekt.
130
130
131
-
But what if we need to duplicate an object?
131
+
Aber was ist, wenn wir ein Objekt duplizieren müssen?
132
132
133
-
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.
133
+
Wir können ein neues Objekt erstellen und die Struktur des bestehenden Objekts nachbilden, indem wir über seine Eigenschaften iterieren und diese auf der primitiven Ebene kopieren.
134
134
135
-
Like this:
135
+
Das geht so:
136
136
137
137
```js run
138
138
let user = {
@@ -141,34 +141,34 @@ let user = {
141
141
};
142
142
143
143
*!*
144
-
let clone = {}; // the new empty object
144
+
let clone = {}; // das neue leere Objekt
145
145
146
-
// let's copy all user properties into it
146
+
// lass uns alle Eigenschaften von user hineinkopieren
147
147
for (let key in user) {
148
148
clone[key] = user[key];
149
149
}
150
150
*/!*
151
151
152
-
// now clone is a fully independent object with the same content
153
-
clone.name = "Pete"; // changed the data in it
152
+
// jetzt ist clone ein vollständig unabhängiges Objekt mit demselben Inhalt
153
+
clone.name = "Pete"; // geänderte Daten darin
154
154
155
-
alert( user.name ); // still John in the original object
155
+
alert( user.name ); // immer noch John im Originalobjekt
156
156
```
157
157
158
-
We can also use the method [Object.assign](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign).
158
+
Wir können auch die Methode [Object.assign](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) verwenden.
159
159
160
-
The syntax is:
160
+
Die Syntax lautet:
161
161
162
162
```js
163
163
Object.assign(dest, ...sources)
164
164
```
165
165
166
-
-The first argument`dest`is a target object.
167
-
-Further arguments is a list of source objects.
166
+
-Das erste Argument`dest`ist ein Zielobjekt.
167
+
-Die weiteren Argumente sind eine Liste von Quellobjekten.
168
168
169
-
It copies the properties of all source objects into the target `dest`, and then returns it as the result.
169
+
Es kopiert die Eigenschaften aller Quellobjekte in das Ziel `dest` und gibt es dann als Ergebnis zurück.
170
170
171
-
For example, we have `user` object, let's add a couple of permissions to it:
171
+
Zum Beispiel wenn wir ein `user`-Objekt haben, dann fügen wir ihm ein paar Berechtigungen hinzu:
If the copied property name already exists, it gets overwritten:
190
+
Wenn der kopierte Eigenschaftsname bereits existiert, wird er überschrieben:
191
191
192
192
```js run
193
193
let user = { name: "John" };
194
194
195
195
Object.assign(user, { name: "Pete" });
196
196
197
-
alert(user.name); // now user = { name: "Pete" }
197
+
alert(user.name); // jetzt user = { name: "Pete" }
198
198
```
199
199
200
-
We also can use `Object.assign` to perform a simple object cloning:
200
+
Wir können `Object.assign`auch verwenden, um eine einfache Objektkopie zu erstellen:
201
201
202
202
```js run
203
203
let user = {
@@ -213,15 +213,15 @@ alert(clone.name); // John
213
213
alert(clone.age); // 30
214
214
```
215
215
216
-
Here it copies all properties of `user` into the empty object and returns it.
216
+
Hier kopiert es alle Eigenschaften von`user`in ein leeres Objekt und gibt es zurück.
217
217
218
-
There are also other methods of cloning an object, e.g. using the [spread syntax](info:rest-parameters-spread) `clone = {...user}`, covered later in the tutorial.
218
+
Es gibt auch andere Methoden, um ein Objekt zu klonen, z.B. unter Verwendung der [Spread-Syntax](info:rest-parameters-spread) `clone = {...user}`, die später im Tutorial behandelt wird.
219
219
220
-
## Nested cloning
220
+
## Geschachteltes Klonen
221
221
222
-
Until now we assumed that all properties of `user` are primitive. But properties can be references to other objects.
222
+
Bis jetzt sind wir davon ausgegangen, dass alle Eigenschaften von `user`primitiv sind. Aber Eigenschaften können auch Referenzen auf andere Objekte sein.
223
223
224
-
Like this:
224
+
So wie hier:
225
225
```js run
226
226
let user = {
227
227
name: "John",
@@ -234,7 +234,7 @@ let user = {
234
234
alert( user.sizes.height ); // 182
235
235
```
236
236
237
-
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:
237
+
Jetzt reicht es nicht aus `clone.sizes = user.sizes` zu kopieren, denn`user.sizes`ist ein Objekt und wird per Referenz kopiert, sodass`clone`und`user`dieselben Größen teilen:
238
238
239
239
```js run
240
240
let user = {
@@ -247,21 +247,21 @@ let user = {
247
247
248
248
let clone = Object.assign({}, user);
249
249
250
-
alert( user.sizes === clone.sizes ); // true, same object
250
+
alert( user.sizes === clone.sizes ); // wahr, gleiches Objekt
251
251
252
-
// user and clone share sizes
253
-
user.sizes.width = 60; // change a property from one place
254
-
alert(clone.sizes.width); // 60, get the result from the other one
252
+
// user und clone teilen sizes
253
+
user.sizes.width = 60; // ändere eine Eigenschaft an einer Stelle
254
+
alert(clone.sizes.width); // 60, bekomme das Ergebnis von der anderen
255
255
```
256
256
257
-
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.
257
+
Um das zu beheben und`user`und`clone`wirklich zu separaten Objekten zu machen, sollten wir eine Klon-Schleife verwenden, die jeden Wert von `user[key]`überprüft und, wenn es ein Objekt ist, dann auch dessen Struktur repliziert. Das wird als "tiefes Klonen" oder "strukturiertes Klonen"bezeichnet. Es gibt die [structuredClone](https://developer.mozilla.org/en-US/docs/Web/API/structuredClone)-Methode, die tiefes Klonen implementiert.
258
258
259
259
260
260
### structuredClone
261
261
262
-
The call`structuredClone(object)`clones the`object`with all nested properties.
262
+
Der Aufruf`structuredClone(object)`klont das`object`mit all seinen geschachtelten Eigenschaften.
263
263
264
-
Here's how we can use it in our example:
264
+
So sieht es aus, wie wir es inunserem Beispiel nutzen können:
265
265
266
266
```js run
267
267
let user = {
@@ -276,50 +276,50 @@ let user = {
276
276
let clone = structuredClone(user);
277
277
*/!*
278
278
279
-
alert( user.sizes === clone.sizes ); // false, different objects
user.sizes.width = 60; // change a property from one place
283
-
alert(clone.sizes.width); // 50, not related
281
+
// user und clone stehen jetzt in keiner Beziehung mehr
282
+
user.sizes.width = 60; // ändere eine Eigenschaft an einer Stelle
283
+
alert(clone.sizes.width); // 50, nicht verwandt
284
284
```
285
285
286
-
The `structuredClone` method can clone most data types, such as objects, arrays, primitive values.
286
+
Die`structuredClone`-Methode kann die meisten Datentypen klonen, wie Objekte, Arrays, primitive Werte.
287
287
288
-
It also supports circular references, when an object property references the object itself (directly or via a chain or references).
288
+
Sie unterstützt auch zirkuläre Referenzen, wenn eine Objekteigenschaft auf das Objekt selbst verweist (direkt oder über eine Kette von Referenzen).
289
289
290
-
For instance:
290
+
Zum Beispiel:
291
291
292
292
```js run
293
293
let user = {};
294
-
// let's create a circular reference:
295
-
// user.me references the user itself
294
+
// erstellen wir eine zirkuläre Referenz:
295
+
// user.me verweist auf das user selbst
296
296
user.me = user;
297
297
298
298
let clone = structuredClone(user);
299
-
alert(clone.me=== clone); //true
299
+
alert(clone.me === clone); // wahr
300
300
```
301
301
302
-
As you can see, `clone.me`references the`clone`, not the `user`! So the circular reference was cloned correctly as well.
302
+
Wie du sehen kannst, verweist `clone.me`auf den`clone`, nicht auf den `user`!Die zirkuläre Referenz wurde also korrekt geklont.
303
303
304
-
Although, there are cases when `structuredClone`fails.
304
+
Allerdings gibt es Fälle, in denen `structuredClone`fehlschlägt.
305
305
306
-
For instance, when an object has a function property:
306
+
Zum Beispiel, wenn ein Objekt eine Funktionseigenschaft hat:
307
307
308
308
```js run
309
-
//error
309
+
// Fehler
310
310
structuredClone({
311
311
f: function() {}
312
312
});
313
313
```
314
314
315
-
Function properties aren't supported.
315
+
Funktionseigenschaften werden nicht unterstützt.
316
316
317
-
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).
317
+
Um solche komplexen Fälle zu handhaben, müssen wir möglicherweise eine Kombination von Klonmethoden verwenden, benutzerdefinierten Code schreiben oder, um das Rad nicht neu zu erfinden, eine vorhandene Implementierung verwenden, zum Beispiel [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) aus der JavaScript-Bibliothek [lodash](https://lodash.com).
318
318
319
-
## Summary
319
+
## Zusammenfassung
320
320
321
-
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.
321
+
Objekte werden per Referenz zugewiesen und kopiert. Anders ausgedrückt, eine Variable speichert nicht den "Objektwert", sondern eine "Referenz" (Adresse im Speicher) auf den Wert. Das Kopieren einer solchen Variablen oder das Übergeben als Funktionsargument kopiert diese Referenz, nicht das Objekt selbst.
322
322
323
-
All operations via copied references (like adding/removing properties) are performed on the same single object.
323
+
Alle Operationen über kopierte Referenzen (wie das Hinzufügen/Entfernen von Eigenschaften) werden am selben einzigen Objekt durchgeführt.
324
324
325
-
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).
325
+
Um eine "echte Kopie" (ein Klon) zu erstellen, können wir `Object.assign`für die sogenannte "flache Kopie" (geschachtelte Objekte werden per Referenz kopiert) oder eine "tiefes Klonen" Funktion`structuredClone`verwenden oder eine benutzerdefinierte Klonimplementierung wie [_.cloneDeep(obj)](https://lodash.com/docs#cloneDeep) nutzen.
0 commit comments