Skip to content

Commit 874731d

Browse files
authored
Merge pull request #199 from behrends/Object_references_and_copying
Object references and copying
2 parents 4032b78 + 71e9668 commit 874731d

File tree

1 file changed

+96
-96
lines changed

1 file changed

+96
-96
lines changed
Lines changed: 96 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,109 +1,109 @@
1-
# Object references and copying
1+
# Objektreferenzen und Kopieren
22

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

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

7-
Let's start with a primitive, such as a string.
7+
Beginnen wir mit einem primitiven Wert, wie einem String.
88

9-
Here we put a copy of `message` into `phrase`:
9+
Hier kopieren wir `message` nach `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 storing the string `"Hello!"`.
16+
Als Ergebnis haben wir zwei unabhängige Variablen, jede speichert den String `"Hello!"`.
1717

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

20-
Quite an obvious result, right?
20+
Ein ziemlich offensichtliches Ergebnis, oder?
2121

22-
Objects are not like that.
22+
Bei Objekten ist das nicht so.
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+
**Eine Variablenzuweisung mit einem Objekt speichert nicht das Objekt selbst, sondern seine "Adresse im Speicher" -- anders ausgedrückt "eine Referenz" darauf.**
2525

26-
Let's look at an example of such a variable:
26+
Sehen wir uns ein Beispiel einer solchen Variable an:
2727

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

34-
And here's how it's actually stored in memory:
34+
Und so wird es tatsächlich im Speicher abgelegt:
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+
Das Objekt wird irgendwo im Speicher abgelegt (rechts im Bild), während die `user`-Variable (links) eine "Referenz" darauf hat.
3939

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

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

44-
Now here's why it's important.
44+
Nun hier ist, warum das wichtig ist.
4545

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

48-
For instance:
48+
Zum Beispiel:
4949

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

53-
let admin = user; // copy the reference
53+
let admin = user; // kopiere die Referenz
5454
```
5555

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

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

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

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:
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'; // geändert durch die "admin"-Referenz
7171
*/!*
7272

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
7474
```
7575
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.
7777
78-
## Comparison by reference
78+
## Vergleich per Referenz
7979
80-
Two objects are equal only if they are the same object.
80+
Zwei Objekte sind nur dann gleich, wenn sie dasselbe Objekt sind.
8181
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:
8383
8484
```js run
8585
let a = {};
86-
let b = a; // copy the reference
86+
let b = a; // kopiere die Referenz
8787

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
9090
```
9191
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):
9393
9494
```js run
9595
let a = {};
96-
let b = {}; // two independent objects
96+
let b = {}; // zwei unabhängige Objekte
9797

98-
alert( a == b ); // false
98+
alert( a == b ); // falsch
9999
```
100100
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.
102102
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* be modified.
103+
````smart header="Const-Objekte können verändert werden"
104+
Eine wichtige Nebenwirkung der Speicherung von Objekten als Referenzen ist, dass ein `const` deklariertes Objekt verändert werden kann.
105105

106-
For instance:
106+
Zum Beispiel:
107107

108108
```js run
109109
const user = {
@@ -117,22 +117,22 @@ user.name = "Pete"; // (*)
117117
alert(user.name); // Pete
118118
```
119119

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

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

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.
125125
````
126126

127-
## Cloning and merging, Object.assign [#cloning-and-merging-object-assign]
127+
## Klonen und Zusammenfügen, Object.assign [#cloning-and-merging-object-assign]
128128

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

131-
But what if we need to duplicate an object?
131+
Aber was ist, wenn wir ein Objekt duplizieren müssen?
132132

133-
We can create a new object 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.
134134

135-
Like this:
135+
Das geht so:
136136

137137
```js run
138138
let user = {
@@ -141,34 +141,34 @@ let user = {
141141
};
142142
143143
*!*
144-
let clone = {}; // the new empty object
144+
let clone = {}; // das neue leere Objekt
145145
146-
// let's copy all user properties into it
146+
// lass uns alle Eigenschaften von user hineinkopieren
147147
for (let key in user) {
148148
clone[key] = user[key];
149149
}
150150
*/!*
151151
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
154154
155-
alert( user.name ); // still John in the original object
155+
alert( user.name ); // immer noch John im Originalobjekt
156156
```
157157

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

160-
The syntax is:
160+
Die Syntax lautet:
161161

162162
```js
163163
Object.assign(dest, ...sources)
164164
```
165165

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

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

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

173173
```js run
174174
let user = { name: "John" };
@@ -177,27 +177,27 @@ let permissions1 = { canView: true };
177177
let permissions2 = { canEdit: true };
178178
179179
*!*
180-
// copies all properties from permissions1 and permissions2 into user
180+
// kopiert alle Eigenschaften von permissions1 und permissions2 in user
181181
Object.assign(user, permissions1, permissions2);
182182
*/!*
183183
184-
// now user = { name: "John", canView: true, canEdit: true }
184+
// jetzt user = { name: "John", canView: true, canEdit: true }
185185
alert(user.name); // John
186-
alert(user.canView); // true
187-
alert(user.canEdit); // true
186+
alert(user.canView); // wahr
187+
alert(user.canEdit); // wahr
188188
```
189189

190-
If the copied property name already exists, it gets overwritten:
190+
Wenn der kopierte Eigenschaftsname bereits existiert, wird er überschrieben:
191191

192192
```js run
193193
let user = { name: "John" };
194194
195195
Object.assign(user, { name: "Pete" });
196196
197-
alert(user.name); // now user = { name: "Pete" }
197+
alert(user.name); // jetzt user = { name: "Pete" }
198198
```
199199

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

202202
```js run
203203
let user = {
@@ -213,15 +213,15 @@ alert(clone.name); // John
213213
alert(clone.age); // 30
214214
```
215215

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

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

220-
## Nested cloning
220+
## Geschachteltes Klonen
221221

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

224-
Like this:
224+
So wie hier:
225225
```js run
226226
let user = {
227227
name: "John",
@@ -234,7 +234,7 @@ let user = {
234234
alert( user.sizes.height ); // 182
235235
```
236236

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

239239
```js run
240240
let user = {
@@ -247,21 +247,21 @@ let user = {
247247
248248
let clone = Object.assign({}, user);
249249
250-
alert( user.sizes === clone.sizes ); // true, same object
250+
alert( user.sizes === clone.sizes ); // wahr, gleiches Objekt
251251
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
255255
```
256256

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

259259

260260
### structuredClone
261261

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

264-
Here's how we can use it in our example:
264+
So sieht es aus, wie wir es in unserem Beispiel nutzen können:
265265

266266
```js run
267267
let user = {
@@ -276,50 +276,50 @@ let user = {
276276
let clone = structuredClone(user);
277277
*/!*
278278
279-
alert( user.sizes === clone.sizes ); // false, different objects
279+
alert( user.sizes === clone.sizes ); // falsch, unterschiedliche Objekte
280280
281-
// user and clone are totally unrelated now
282-
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
284284
```
285285

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

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).
289289

290-
For instance:
290+
Zum Beispiel:
291291

292292
```js run
293293
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
296296
user.me = user;
297297
298298
let clone = structuredClone(user);
299-
alert(clone.me === clone); // true
299+
alert(clone.me === clone); // wahr
300300
```
301301

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

304-
Although, there are cases when `structuredClone` fails.
304+
Allerdings gibt es Fälle, in denen `structuredClone` fehlschlägt.
305305

306-
For instance, when an object has a function property:
306+
Zum Beispiel, wenn ein Objekt eine Funktionseigenschaft hat:
307307

308308
```js run
309-
// error
309+
// Fehler
310310
structuredClone({
311311
f: function() {}
312312
});
313313
```
314314

315-
Function properties aren't supported.
315+
Funktionseigenschaften werden nicht unterstützt.
316316

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).
318318

319-
## Summary
319+
## Zusammenfassung
320320

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

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

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

Comments
 (0)