Signatur
Beschreibung
Das Interface Storage ist der gemeinsame Typ hinter window.localStorage und window.sessionStorage. Man erzeugt es nicht selbst: Der Browser stellt pro Ursprung (Protokoll + Host + Port) je eine Instanz bereit. Die Daten werden als einfache Schlüssel-Wert-Paare abgelegt, wobei Schlüssel und Werte immer Strings sind.
Die wichtigsten Mitglieder sind:
setItem(key, value): legt einen Eintrag an oder überschreibt ihn.getItem(key): liest einen Wert, odernull, wenn der Schlüssel fehlt.removeItem(key): entfernt einen Eintrag.clear(): löscht alle Einträge dieses Speichers.key(index): gibt den Schlüssel an Positionindexzurück, odernull.length: Anzahl der gespeicherten Einträge (nur lesbar).
localStorage bleibt über Browser-Neustarts hinweg erhalten, bis Skript oder Nutzer die Daten löschen. sessionStorage gilt nur für den jeweiligen Tab bzw. das Fenster und verschwindet, wenn der Tab geschlossen wird. Beide eignen sich für kleine Datenmengen wie Nutzereinstellungen, Formularentwürfe oder UI-Zustände, typischerweise ungefähr 5 MiB pro Ursprung.
Alle Zugriffe laufen synchron und blockieren den Haupt-Thread. Für große oder strukturierte Datenmengen ist deshalb IndexedDB besser geeignet. Wenn sich localStorage in einem anderen Tab desselben Ursprungs ändert, erhalten die übrigen Tabs das Event storage.
Rückgabewert
window.localStorage oder window.sessionStorage. Ein öffentlicher Konstruktor existiert nicht: new Storage() wirft einen TypeError.Beispiele
Grundoperationen: setzen, lesen, entfernen
// Instanz vom Browser: localStorage ist vom Typ Storage
console.log(localStorage instanceof Storage);
localStorage.setItem('theme', 'dark');
console.log(localStorage.getItem('theme'));
console.log(localStorage.getItem('gibtEsNicht'));
localStorage.removeItem('theme');
console.log(localStorage.length);
Objekte als JSON speichern (mit sicherem Einlesen)
const saveSettings = (settings) => {
localStorage.setItem('settings', JSON.stringify(settings));
};
const loadSettings = (fallback = { fontSize: 16, lang: 'de' }) => {
const raw = localStorage.getItem('settings');
if (raw === null) return fallback;
try {
return { ...fallback, ...JSON.parse(raw) };
} catch {
return fallback; // beschädigte Daten ignorieren
}
};
saveSettings({ fontSize: 18 });
console.log(loadSettings());
Alle Einträge auflisten und Formularentwurf in sessionStorage halten
sessionStorage.setItem('draft:title', 'Mein Artikel');
sessionStorage.setItem('draft:body', 'Erster Absatz …');
for (let i = 0; i < sessionStorage.length; i++) {
const key = sessionStorage.key(i);
console.log(`${key} = ${sessionStorage.getItem(key)}`);
}
// Entwurf nach erfolgreichem Absenden verwerfen
const clearDraft = () => {
Object.keys(sessionStorage)
.filter((k) => k.startsWith('draft:'))
.forEach((k) => sessionStorage.removeItem(k));
};
clearDraft();
console.log(sessionStorage.length);
Speicherlimit abfangen und Tabs synchronisieren
const safeSet = (key, value) => {
try {
localStorage.setItem(key, value);
return true;
} catch (err) {
if (err.name === 'QuotaExceededError') {
console.warn('Speicher voll – Eintrag nicht gespeichert.');
}
return false;
}
};
safeSet('cart', JSON.stringify([{ id: 42, qty: 1 }]));
// Wird nur in ANDEREN Tabs desselben Ursprungs ausgelöst
window.addEventListener('storage', (event) => {
if (event.storageArea === localStorage && event.key === 'cart') {
console.log('Warenkorb geändert:', event.newValue);
}
});
// Wichtig · Fallstricke
- Nur Strings: Andere Werte werden in Strings umgewandelt.
setItem('n', 1)ergibt beim Lesen"1", und ein Objekt wird zu"[object Object]". Deshalb Objekte mitJSON.stringifyundJSON.parseumwandeln. - Kein sicherer Ort für Geheimnisse: Jedes Skript auf der Seite kann den Speicher lesen, auch per XSS eingeschleuster Code. Zugangstoken oder Sitzungs-IDs gehören besser in
HttpOnly-Cookies. Gelesene Werte nie ungeprüft perinnerHTMLeinfügen. - Ausnahmen:
setItemwirftQuotaExceededError, wenn das Limit erreicht ist. In manchen Umgebungen wirft schon der Zugriff auflocalStorageeinenSecurityError, etwa bei blockierten Cookies oder in Sandbox-iframes. Zugriffe daher intry/catchkapseln. - Synchron: Große oder häufige Schreibvorgänge blockieren den Haupt-Thread. In Web- und Service-Workern ist
Storagenicht verfügbar. - Eigenschaftszugriff vermeiden:
localStorage.foo = 'x'funktioniert zwar, kann aber mit eingebauten Methodennamen wiekeyoderlengthkollidieren. Besser immersetItem/getItemverwenden. - Das Event
storagewird nur in anderen Dokumenten ausgelöst, nicht im Tab, der die Änderung vorgenommen hat. - Privater Modus: Hier wird der Speicher beim Schließen gelöscht. Safari entfernt Skript-Speicher außerdem nach 7 Tagen ohne Nutzerinteraktion (ITP).