JavaScript/Objekte/Storage
Inhaltsverzeichnis
Das Storage-Objekt ist ein Teil des WebStorage-API. Storage-Objekte werden vom Browser erzeugt, um den Inhalt des Local Storage und des Session Storage aufzunehmen.
Weiter führende Informationen zum WebStorage API und Beispiele finden Sie im WebStorage-API Artikel.
Vererbungshierarchie
Storage
Es gibt zwar ein globales Objekt Storage
, das formal die Konstruktorfunktion für Storage-Objekte darstellt, diese Funktion kann aber weder direkt noch über den new-Operator aufgerufen werden. Sie besitzt auch keine eigenen Eigenschaften oder Methoden. Ihr einziger Zweck ist es, in Storage.prototype
das Prototyp-Objekt für Storage-Objekte bereitzustellen.
Storage.prototype
Eigenschaften
- length
Methoden
Achtung!
getItem
, setItem
und removeItem
sind vom Typ String. Wenn Sie einen Wert mit einem anderen Datentyp übergeben, wird er in einen String konvertiert. Dies kann unerwartete Konsequenzen haben:
- Die Werte
undefined
undnull
werden in'undefined'
und'null'
konvertiert - Objekte werden mittels ihrer toString() konvertiert. Die wenigsten Objekte implementieren hier eine Konvertierung, die zu einem String führt, aus dem sich das Objekt später rekonstruieren lässt.
length
Die length
Eigenschaft wird, anders als beispielsweise bei Arrays, von Storage.prototype
an Storage-Objekte vererbt. Sie ermittelt die Anzahl der im Storage-Objekt gespeicherten Schlüssel
getItem(key)
Die getItem
-Methode liest den Wert aus, der unter den angegebenen Schlüssel abgelegt wurde. Wenn Sie als Schlüssel etwas anderes als eine Zeichenkette übergeben, wird es in einen String konvertiert.
Parameter | Typ | Bedeutung |
---|---|---|
key | Zeichenkette | Name eines im Storage abgelegten Name-Wert (key-value) Paares |
Rückgabewert | Zeichenkette | Der Wert, der unter dem angegebenen Namen gespeichert ist, oder null , wenn unter diesem Schlüssel nichts gespeichert war.
|
setItem(key, value)
Mit setItem()
speichern Sie im Storage-Objekt einen Wert.
key
schon besteht, wird er ohne Warnung überschrieben.Parameter | Typ | Bedeutung |
---|---|---|
key | Zeichenkette | Name, unter dem der Inhalt des value-Parameters im Storage abgelegt werden soll |
value | Zeichenkette | Der zu speichernde Wert. |
Rückgabewert | undefined |
removeItem(key)
removeItem
löscht einen Eintrag aus dem Storage-Objekt.
Parameter | Typ | Bedeutung |
---|---|---|
key | Zeichenkette | Name des Schlüssels, der mit seinem Wert zu entfernen ist |
Rückgabewert | undefined |
key(index)
Parameter | Typ | Bedeutung |
---|---|---|
index | Integer | Nummer von 0 bis (length-1) |
Rückgabewert | Der unter der übergebenen Nummer gespeicherte Schlüsselname |
Sie können die key()
-Methode verwenden, um alle Schlüsselnamen in einem Storage-Objekt zu ermitteln. Durchlaufen Sie dafür in einer Schleife die Werte von 0 bis (length-1) und rufen Sie key()
mit diesen Indexnummern auf. Die Reihenfolge der Schlüssel ist nicht festgelegt - wenn Sie die Schlüssel alphabetisch haben möchten, müssen Sie sie sortieren. Die Zugangsreihenfolge der Schlüssel (wie zum Beispiel in einem assoziativen PHP Array) wird vom Storage-Objekt nicht festgehalten.
clear()
Die Methode clear()
erwartet keinen Parameter und gibt auch nichts zurück. Sie löscht den Inhalt des Storage-Objekts vollständig.
Beispiele
Speichern und Lesen von Strings
Das Speichern von Zeichenketten funktioniert sehr einfach:
localStorage.setItem('Aufgabe_1', 'Aktiv am Self-Wiki mitarbeiten!');
console.log('Aufgabe 1: ' + localStorage.getItem('Aufgabe_1'));
Zahlen, Boolesche Werte, Date-Objekte
Sie können an setItem()
als Wert auch Zahlen, boolesche Werte oder Datumsobjekte übergeben. Diese werden in einen String konvertiert und gespeichert. Um sie nach dem Auslesen mit getItem()
wieder in ihren ursprünglichen Typ zurückzuwandeln, müssen Sie ihn konvertieren. Angenommen, dass der gelesene Wert in der Variablen wert
steht, können Sie
Integer-Werte | mit Number(wert) oder parseInt(wert) konvertieren
|
---|---|
Fließkomma-Werte | mit Number(wert) oder parseFloat(wert) konvertieren
|
Date-Werte | mit new Date(wert) konvertierenSie müssen new verwenden, weil ein Date ein Objekt ist. |
Boolean-Werte | mit (wert === 'true') konvertieren
|
localStorage.setItem("zahl", 47.11);
localStorage.setItem("logik", false);
localStorage.setItem("datum", new Date(2023,03,14)); // Monat 3 ist April!
const zahl = Number(localStorage.getItem("zahl"));
const logik = Boolean(localStorage.getItem("logik"));
const heute = new Date(localStorage.getItem("datum")); // Achtung, hier new verwenden!
Symbole
Symbole lassen sich nicht in einem Storage-Objekt speichern. Weder direkt, noch als Wert einer Objekteigenschaft (JSON.stringify überspringt Eigenschaften, in denen ein Symbol gespeichert ist).
Probleme mit undefined und null
Achten Sie darauf, dass Sie nicht null
oder undefined
als key oder value an eine der Storage-Methoden übergeben. Die automatische Umwandlung in Zeichenketten findet auch hier statt, und zwar rücksichtslos in die Zeichenketten "null"
beziehungsweise "undefined"
.
const storageKey = null;
localStorage.setItem(storageKey, 'Dreimol Null es Null es Null...');
console.log("Unter dem Schlüssel 'null' finden Sie: " + localStorage.getItem('null'));
// Schöne Jröß uss d'r Kayjass
Arrays und beliebige Objekte
Wenn Sie ein Array oder ein Objekt (außer Date) speichern möchten, dann sollten Sie das mit Hilfe einer JSON-Codierung tun.
const info = {
thema: 'Web Storage API',
abschnitt: 'Speichern von Werten'
text: 'Verwenden Sie die <code>setItem</code>-Methode zum Speichern.'
};
localStorage.setItem('aktueller_abschnitt', JSON.stringify(info));
let storedInfo = JSON.parse(localStorage.getItem('aktueller_abschnitt'));
console.log('Aktueller Abschnitt: ' + storedInfo.abschnitt);
console.log(storedInfo.text);
Vorhandene Schlüssel im localStorage
Das Storage-Objekt besitzt eine length
-Eigenschaft, die die Anzahl der darin abgelegten Einträge zurückliefert. Damit können Sie eine Schleife programmieren, um mit Hilfe der Methode key(n)
den an Position n
gespeicherten Schlüssel zu bestimmen und darüber dann den gespeicherten Wert zu erhalten. Die Schlüsselnummern laufen von 0
bis length - 1
.
for (let i=0; i < localStorage.length; i++) {
let storageKey = localStorage.key(i);
console.log(storageKey + ' : ' + localStorage.getItem(storageKey));
}
key()
mit einer ungültigen Schlüsselnummer aufrufen, erhalten Sie keinen Fehler, sondern den JavaScript-Wert null
(der für "kein Objekt vorhanden" steht). Das gleiche geschieht, wenn Sie getItem()
mit einem unbekannten Schlüsselnamen aufrufen.Alternativer Zugriff mit Eigenschaften
Die setItem()
Methode speichert das übergebene Name-Wert Paar in einer internen Datenstruktur des Storage-Objekts. Gleichzeitig erzeugt sie aber auch auf dem Storage-Objekt eine neue Eigenschaft, deren Name dem übergebenen Namen entspricht. Es sei denn, dieser Name wird bereits von einer Eigenschaft oder Methode verwendet, die das Storage-Objekt erbt.
Der Aufruf
localStorage.setItem('selfhtml', 'Die Energie des Verstehens');
erzeugt auf dem Storage-Objekt eine Eigenschaft namens selfhtml
, auf die Sie mit
localStorage.selfhtml
zugreifen können. Sie können diese Eigenschaft auch mittels
localStorage.selfhtml = 'Die Energie des Verstehens';
erzeugen, das Storage-Objekt erkennt den Schreibzugriff auf eine Eigenschaft und überträgt das in seine interne Datenstruktur.
Wenn Sie einen Schlüsselnamen verwenden, der als JavaScript-Name nicht zulässig ist, können Sie - wie bei normalen Objekten - auch auf die Indexschreibweise zurückgreifen:
localStorage['Key.47-11'] = 'Echt Kölnisch Wasser';
Praktisch? Vielleicht. Sinnvoll? NEIN! Denn das Storage-Objekt erbt Eigenschaften und Methoden von seinem Prototypen, und Sie können mit diesen Namen kollidieren. Sie könnten beispielsweise mit
localStorage.setItem("clear", "sky");
in dem internen Speicher des Storage-Objekts einen Eintrag mit dem Namen clear
erstellen und ihn mit
localStorage.getItem("clear");
auch wieder abrufen. Aber wenn Sie
localStorage.clear
abrufen, finden Sie das Function-Objekt, das die clear-Methode implementiert. setItem
überschreibt keine geerbten Eigenschaften oder Methoden. Und wenn Sie dies tun:
localStorage.clear = 'Klare Sache!'; console.log(localStorage.getItem('clear')); console.log(localStorage.clear); localStorage.clear();
so wird die erste Ausgabe 'Klare Sache!' sein. Die zweite Ausgabe - ebenfalls!!. Und der Versuch, dann clear() aufzurufen, wirft einen TypeError: localStorage.clear is not a function.
Und schließlich können Sie mit dem delete
Operator auch Einträge aus dem Storage-Objekt entfernen, selbst wenn dafür keine Eigenschaft auf dem Storage-Objekt angelegt wurde.
localStorage.selfhtml = 'Die Energie des Verstehens'; localStorage.setItem('clear', 'Klaro'); console.log(localStorage.getItem('selfhtml'); // Die Energie des Verstehens console.log(localStorage.getItem('clear'); // Klaro console.log(localStorage.clear); // ƒ clear() { [native code] } delete localStorage.selfhtml; delete localStorage.clear; console.log(localStorage.selfhtml); // undefined console.log(localStorage.getItem('selfhtml')); // undefined console.log(localStorage.getItem('clear'); // undefined
getItem()
, setItem()
und removeItem()
benutzen und die Verwendung der Eigenschaftenschreibweise meiden.Links
- <https://html.spec.whatwg.org/multipage/webstorage.html WebStorage API in der HTML Spezifikation>
- <https://developer.mozilla.org/en-US/docs/Web/API/Storage Das Storage Objekt bei Mozilla>