localStorage va sessionStorage
localStorage va sessionStorage โ brauzerda kalit-qiymat (key/value) ko'rinishida ma'lumot saqlash uchun ob'yektlardir. Ular cookie'dan farqli o'laroq serverga yuborilmaydi, ancha katta hajmga (odatda ~5 MB) ega va foydalanish uchun ancha qulay. Ularni birgalikda Web Storage deb ataladi.
Web Storage nima
Ikkala ob'yekt ham bir xil metod va xususiyatlarga ega. Farqi โ ma'lumot qancha vaqt saqlanishida va qaysi oynalar orasida ulashilishida:
localStorageโ ma'lumot brauzer yopilib qayta ochilsa ham saqlanadi. Bitta domenning barcha tab va oynalari orasida ulashiladi;sessionStorageโ ma'lumot faqat joriy brauzer tab'i uchun saqlanadi va tab yopilganda o'chadi. Har bir tab o'z alohidasessionStorageiga ega.
localStorage mavjud emas, shu sabab bu misollarni brauzer konsolida sinang.Asosiy metodlar
Web Storage quyidagi metod va xususiyatlarni beradi (misolda localStorage, lekin sessionStorage aynan bir xil):
setItem(key, value)โ kalit/qiymat juftligini saqlaydi;getItem(key)โ kalit bo'yicha qiymatni oladi;removeItem(key)โ kalit bo'yicha juftlikni o'chiradi;clear()โ barcha juftliklarni o'chiradi;key(index)โ indeks bo'yicha kalit nomini beradi;lengthโ saqlangan juftliklar soni.
// Brauzerda:
localStorage.setItem('user', 'Ali');
console.log(localStorage.getItem('user')); // "Ali"
localStorage.removeItem('user');
console.log(localStorage.getItem('user')); // null
localStorage.setItem('a', '1');
localStorage.setItem('b', '2');
localStorage.clear();
console.log(localStorage.length); // 0
getItem null qaytaradi (cookie'dagi undefineddan farqli).Obyekt kabi murojaat
Web Storage'ga oddiy obyekt kabi ham murojaat qilish mumkin โ nuqta yoki kvadrat qavs orqali:
// bular ishlaydi, lekin tavsiya etilmaydi:
localStorage.user = 'Ali';
console.log(localStorage.user); // "Ali"
delete localStorage.user;
length, setItem kabi ichki nom bilan to'qnashsa, xatti-harakat buziladi. setItem/getItem esa har doim ishonchli ishlaydi.Faqat satr saqlanadi
Web Storage'da faqat satr (string) saqlash mumkin. Kalit ham, qiymat ham satr bo'lishi shart. Boshqa turdagi qiymat berilsa, u avtomatik satrga aylantiriladi, bu ko'pincha kutilmagan natija beradi:
localStorage.setItem('num', 123);
console.log(localStorage.getItem('num')); // "123" (satr!)
console.log(typeof localStorage.getItem('num')); // "string"
localStorage.setItem('obj', { a: 1 });
console.log(localStorage.getItem('obj')); // "[object Object]" โ buzilgan!
[object Object] satriga aylantiradi โ ma'lumot yo'qoladi. Obyektlarni doim JSON orqali saqlang (keyingi bo'lim).Obyektlarni JSON orqali saqlash
Obyekt yoki massiv saqlash uchun ularni JSON.stringify bilan satrga, o'qishda esa JSON.parse bilan qayta obyektga aylantiramiz:
let user = { name: 'Ali', age: 25, roles: ['admin', 'user'] };
// saqlash:
localStorage.setItem('user', JSON.stringify(user));
// o'qish:
let stored = JSON.parse(localStorage.getItem('user'));
console.log(stored.name); // "Ali"
console.log(stored.roles[0]); // "admin"
Xavfsiz o'qish uchun null holatini hisobga olgan yordamchi funksiya foydali:
function saveJSON(key, value) {
localStorage.setItem(key, JSON.stringify(value));
}
function loadJSON(key) {
let raw = localStorage.getItem(key);
return raw === null ? null : JSON.parse(raw);
}
saveJSON('settings', { theme: 'dark', lang: 'uz' });
let s = loadJSON('settings');
console.log(s.theme); // "dark"
JSON.parse noto'g'ri formatdagi satr uchun xatolik tashlaydi. Ishonchsiz ma'lumotni o'qishda try...catch ishlatish yoki loadJSONni himoyalash foydali.Kalitlar bo'yicha aylanish
Web Storage โ iterable emas, ya'ni uni to'g'ridan-to'g'ri for..of bilan aylantirib bo'lmaydi. Barcha kalitlarni ko'rish uchun length va key(i) ishlatiladi:
// barcha juftliklarni chiqarish:
for (let i = 0; i < localStorage.length; i++) {
let key = localStorage.key(i);
console.log(key + ' = ' + localStorage.getItem(key));
}
Yoki barcha kalitlarni bir vaqtda olish uchun Object.keys ishlatish mumkin โ bu faqat o'z (own) kalitlarni beradi, ichki metodlarni chetlab o'tadi:
let keys = Object.keys(localStorage);
for (let key of keys) {
console.log(key + ' = ' + localStorage.getItem(key));
}
for..in tsiklini ishlatmang โ u setItem, length kabi ichki maydonlarni ham aylantirib chiqadi. Object.keys yoki key(i) usuli xavfsizroq.storage hodisasi
localStorage yoki sessionStorage o'zgarganda storage hodisasi ishga tushadi. Muhim jihat: bu hodisa o'zgarishni amalga oshirgan oynada emas, boshqa oynalarda ishlaydi. Bu bir domenning turli tab'lari orasida ma'lumot almashishga imkon beradi:
// Brauzerda, bir tab'da:
window.addEventListener('storage', function(event) {
console.log('Kalit: ' + event.key);
console.log('Eski qiymat: ' + event.oldValue);
console.log('Yangi qiymat: ' + event.newValue);
console.log('URL: ' + event.url);
console.log('Storage: ', event.storageArea);
});
// boshqa tab'da:
// localStorage.setItem('user', 'Vali');
// yuqoridagi handler birinchi tab'da ishga tushadi
event ob'yektining foydali xususiyatlari:
event.keyโ o'zgargan kalit (clear()chaqirilsanull);event.oldValueโ eski qiymat;event.newValueโ yangi qiymat (o'chirilsanull);event.urlโ yangilanish sodir bo'lgan hujjat URL'i;event.storageAreaโ o'zgargan storage obyekti (localStorageyokisessionStorage).
storage hodisasi tab'lar orasida oddiy "xabar almashish" mexanizmi sifatida ishlatilishi mumkin: bir tab localStoragega yozadi, boshqalari hodisa orqali xabar oladi.localStorage va sessionStorage farqi
Ikkalasining amaliy farqlari quyidagicha:
- Umr ko'rish:
localStorageโ brauzer yopilib qayta ochilsa ham saqlanadi;sessionStorageโ tab yopilganda o'chadi; - Ulashish ko'lami:
localStorageโ bir domenning barcha tab/oynalari orasida ulashiladi;sessionStorageโ faqat bitta tab ichida (hatto ayni domenning ikkinchi tab'i alohidasessionStorageiga ega); - Sahifa yangilanishi:
sessionStoragesahifa yangilanganda (F5) saqlanadi, lekin yangi tab ochilganda yo'q; - storage hodisasi: har ikkalasi ham hodisa chiqaradi, lekin
sessionStoragealohida tab'ga tegishli bo'lgani uchun uning hodisasi kamroq foyda beradi.
localStorage, vaqtinchalik forma holatini bitta tab uchun saqlashda esa sessionStorage mos keladi.Cheklovlar
- Hajm odatda ~5 MB (brauzerga qarab o'zgaradi) โ cookie'dan ancha katta;
- Faqat satr saqlanadi โ obyektlar uchun JSON kerak;
- Sinxron API โ juda katta ma'lumotni yozish/o'qish interfeysni sekinlashtiradi;
- Ma'lumot serverga yuborilmaydi (bu ko'pincha afzallik);
- Yashirin (private/incognito) rejimda ma'lumot tab yopilganda o'chishi mumkin.
Xulosa
- Web Storage โ brauzerda kalit-qiymat saqlashning oddiy va katta hajmli usuli (~5 MB);
setItem/getItem/removeItem/clearasosiy metodlar;key(i)valengthaylanish uchun;- Faqat satr saqlanadi โ obyektni
JSON.stringify/JSON.parsebilan o'ramoq kerak; - Aylanish uchun
Object.keysyokikey(i)ishlating,for..indan qoching; storagehodisasi o'zgarishlarni boshqa tab'larga xabar qiladi;localStorageโ barqaror va tab'lar orasida ulashiladi;sessionStorageโ vaqtinchalik va bitta tab uchun.