
Cookies are small text files stored in the browser. They are used to pass data between the client and the server, and they are a common mechanism for tracking session data, preferences, and user state.
document.cookie = "name=oeschger";
document.cookie = "favorite_food=tripe";
alert(document.cookie);
// shows: name=oeschger;favorite_food=tripedocument.cookie = "test1=Hello";
document.cookie = "test2=World";
const myCookie = document.cookie.replace(
/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/,
"$1"
);
alert(myCookie);
// shows: WorldWeb Storage includes localStorage and sessionStorage.
// save data to localStorage
localStorage.setItem("key", "value");
// read data from localStorage
let data = localStorage.getItem("key");
// remove one item
localStorage.removeItem("key");
// clear everything
localStorage.clear();sessionStorage is used in the same way.
localStorage: persists until the user clears it or the site removes it.sessionStorage: only lasts for the current tab session.localStorage: shared across pages under the same origin.sessionStorage: limited to the current tab session.localStorage: shared across same-origin pagessessionStorage: isolated per tabUse localStorage when data should survive longer and be shared across pages. Use sessionStorage when data only needs to live during the current session.
IndexedDB is a lower-level browser API for storing large amounts of structured data, including files and binary large objects. It uses indexes for efficient querying.
const request = indexedDB.open("myDatabase", 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
const usersStore = db.createObjectStore("users", {
keyPath: "id",
autoIncrement: true,
});
usersStore.createIndex("name", "name", { unique: false });
usersStore.createIndex("email", "email", { unique: true });
};
request.onsuccess = (event) => {
const db = event.target.result;
const transaction = db.transaction("users", "readwrite");
const usersStore = transaction.objectStore("users");
usersStore.add({ name: "John Doe", email: "john@example.com" });
usersStore.add({ name: "Alice Smith", email: "alice@example.com" });
const emailIndex = usersStore.index("email");
const request = emailIndex.get("john@example.com");
request.onsuccess = (event) => {
const user = event.target.result;
if (user) {
console.log(user);
} else {
console.log("User not found.");
}
};
};
request.onerror = (event) => {
console.error("Error opening database:", event.target.error);
};This is only a simple example. IndexedDB supports more complex queries, ranges, indexes, and transaction patterns.
localStorageCache Storage is a browser API for caching resource files. It is especially important in PWAs because it allows HTML, CSS, JavaScript, images, and other assets to be cached locally for offline usage and faster repeat loads.
self.addEventListener("install", (event) => {
event.waitUntil(
caches.open("my-cache").then((cache) => {
return cache.addAll([
"/",
"/index.html",
"/styles.css",
"/script.js",
"/images/logo.png",
]);
})
);
});
self.addEventListener("fetch", (event) => {
event.respondWith(
caches.match(event.request).then((response) => {
if (response) {
return response;
}
return fetch(event.request).then((response) => {
const clonedResponse = response.clone();
caches.open("my-cache").then((cache) => {
cache.put(event.request, clonedResponse);
});
return response;
});
})
);
});This is a simple Service Worker example. Cache Storage is usually used together with Service Workers for offline support and request interception.
Memory storage means keeping data only in runtime memory. It is often used for simple state management, especially in small applications or component-level state sharing.
Typical examples include Vue's data or React's useState. These are memory-based state containers and are everywhere in day-to-day frontend development.
In practice, frontend applications often combine multiple storage strategies. The right choice depends on capacity, persistence, sharing needs, and the complexity of the application.