Das Symbol in Javascript

Lernen Sie Symbole kennen: Der eindeutige Datentyp für Objekteigenschaften

In JavaScript sind Symbole eindeutige Datentypen, die zum Erstellen von Bezeichnern für Objekteigenschaften verwendet werden können. Symbole sind nicht wie Zeichenfolgen oder Zahlen und können nicht in diese Datentypen konvertiert werden. Das macht sie ideal für die Erstellung von Identifikatoren.

Verwendung von Symbolen in Javascript

Wenn Sie ein Symbol erstellen, können Sie ihm optional eine Beschreibung geben. Dies ist zum Debuggen nützlich, aber nicht erforderlich.

Das Erstellen eines Symbols ist einfach.

const mySymbol = Symbol();

Sie können auch ein Symbol mit einer Beschreibung erstellen.

const mySymbol = Symbol("my description");

Wenn Sie mehrere Symbole mit derselben Beschreibung erstellen, handelt es sich um unterschiedliche Werte.

const sym1 = Symbol("foo");
const sym2 = Symbol("foo");

// false
console.log(sym1 === sym2);

Was macht Symbole einzigartig?

Symbole werden häufig als Bezeichner für Objekteigenschaften verwendet. Dies liegt daran, dass Symbole garantiert eindeutig sind und nicht in Zeichenfolgen konvertiert werden.

const obj = {};
obj[mySymbol] = "bar";

// "bar"
console.log(obj[mySymbol]);

Sie können Symbole als Schlüssel für Objekteigenschaften verwenden, aber Sie können sie nicht als Eigenschaftsnamen (Schlüssel) in JSON verwenden.

const sym = Symbol("foo");
const obj = { [sym]: "bar" };

// {}
console.log(JSON.stringify(obj));

Symbole sind nicht aufzählbar, daher werden sie nicht angezeigt, wenn Sie eine for-in-Schleife für ein Objekt verwenden.

const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";

for (var key in obj) {
  // undefined
  console.log(key);
}

Sie können Object.getOwnPropertySymbols verwenden, um ein Array aller Symbole auf einem Objekt zu erhalten.

const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";

const symbols = Object.getOwnPropertySymbols(obj);

// [Symbol(a), Symbol(b)]
console.log(symbols);

Verwenden eines Symbols als Iterator

Sie können den bekannten Symbol.iterator verwenden, um ein Symbol zu erhalten, das als Iterator verwendet werden kann.

const arr = [1, 2, 3];
const it = arr[Symbol.iterator]();

// { value: 1, done: false }
console.log(it.next());

// { value: 2, done: false }
console.log(it.next());

// { value: 3, done: false }
console.log(it.next()); 

// { value: undefined, done: true }
console.log(it.next());

Ein realeres Beispiel

Sie können Ihre eigenen Symbole erstellen, aber es gibt keine Möglichkeit zu garantieren, dass sie einzigartig sind. Wenn Sie ein eindeutiges Symbol benötigen, sollten Sie Symbol() verwenden.

Angenommen, Sie haben ein Objekt, das eine Person darstellt. Sie möchten diesem Objekt eine Eigenschaft hinzufügen, die das Geburtsjahr der Person speichert, aber Sie möchten nicht, dass diese Eigenschaft aufzählbar ist. Sie können dies mit einem Symbol tun:

const person = {
  name: "John Doe"
};
const birthYear = Symbol("birth year");
person[birthYear] = "1955";

for (var key in person) {
  // name
  console.log(key); 
}

// 1955
console.log(person[birthYear]);