Gianluca Frongia

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: js-image-1

Aber weil es JavaScript ist: js-image-1

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.

Gianluca Frongia © 2020