JavaScript Symbol erklärt
Symbol ist ein primitiver Datentyp, zusammen mit string, number, boolean, null und undefined.
Eigenschaften
- Jeder zurückgegebene Symbol Value von
Symbol()
ist unique - Verfügt über statische Eigenschaften
- Verfügt über statische Methoden
hmmm ähnelt einer eingebauten Objektklasse 🤔
Dann sollte das hier funktionieren:
Die Erklärung warum es nicht funktioniert:
This prevents authors from creating an explicit Symbol wrapper object instead of a new symbol value and might be surprising as creating explicit wrapper objects around primitive data types is generally possible (for example, new Boolean, new String and new Number). Quelle: mdn >
Merke
Erstellen wir mal drei verschiedene Symbols.
let symbol1 = Symbol()
let symbol2 = Symbol("yeet")
let symbol3 = Symbol("yeet")
Und vergleichen 2. und 3.
symbol2 === symbol3 // false
Achtung! Beim erstellen eines Symbol erhalten wir immer einen unique Symbol.
Wieso Symbols ?
Die Hintergrundsidee von Symbols war es private properties zu ermöglichen.
Leider sind sie nicht ganz private, da wir sie durch eine Reflection wie: Object.getOwnPropertySymbols
holen können:
let symbol = Symbol("yeet")
let obj =
{
[symbol]: 2,
};
> Object.getOwnPropertySymbols(obj)[Symbol(yeet)]
Daher beschränkt sich ihr Verwendungszweck auf die Vermeidung von Namenskonflikten zwischen properties.
Beispiele
Wie vorher genannt für "private" properties:
let obj = {}
let nachname = Symbol()
obj["name"] = "tupac"
obj[nachname] = "shakur"
console.log(obj) > { name: "tupac", [Symbol()]: "shakur" }
Ist auch nicht sichtbar in einer for
loop:
for (let item in obj) {
console.log(item)
};
> name
Auch wenn wir das Objekt in einen JSON string verwandeln wollen:
console.log(JSON.stringify(obj));
> {"name":"tupac"}
Recap
Symbols werden häufig für folgende use-cases gebraucht:
- Unique properties welche nicht überschreibar sind
- Unique keys für Objekte properties.