Symbol
Symbole sind einer der primitiven Datentypen in EcmaScript6.
Symbole werden ohne new Operator erstellt, sonst gibt es einen TypeError
.
const sym = Symbol('visible');
Symbole sind einzigartig.
console.log(Symbol() === Symbol()); // false
console.log(Symbol('sym') === Symbol('sym')); // false
Symbole sind Symbole.
console.log(typeof Symbol()); // symbol
console.log(typeof Symbol('sym')); // symbol
Es existiert eine laufzeitweite Symbolregistrierung, diese kann durchsucht werden.
Entweder wird das bestehende Symbol zurück gegeben oder ein neues wird erzeugt.
console.log(Symbol.for('sym') === Symbol.for('sym')); // true
Wenn ein eindeutiger Zustand benötigt wird, der einmalig ist, sind Symbole die richtige Wahl.
Synchronisieren von Daten, Sichtbarkeit von Elementen oder Zustand einer Animation oder eines Videos.
Symbole können innerhalb von Funktionen verwenden werden.
const visible = Symbol('visible');
function Point(x, y) {
this.x = x;
this.y = y;
this[visible] = false;
}
Point.prototype.isVisible = function () {
return this[visible];
};
Point.prototype.show = function () {
this[visible] = true;
};
const p = new Point(3, 4);
console.log(p); // Point {}
console.log(p.isVisible()); // false
p.show();
console.log(p.isVisible()); // true
console.log(Object.getOwnPropertyNames(p)); // ["x", "y"]
console.log(Object.getOwnPropertySymbols(p)); // [ Symbol(visible) ]
Symbole können innerhalb von Objekten verwenden werden.
const obj = {
[Symbol()]: 'A',
[Symbol('b')]: 'B',
description: 'object example'
};
Bei der Ausgabe des Objekts sind die Symbole nicht enthalten.
console.log(obj); // { description: 'object example' }
console.log(Object.keys(obj)); // [ 'description' ]
console.log(JSON.stringify(obj)); // {"description":"object example"}
console.log(Object.getOwnPropertyNames(obj)); // [ 'description' ]
Um die Symbole auszugeben, wie oben schon gezeigt, existiert eine spezielle Methode von Object.
console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol(), Symbol(b) ]