javascript中本地存儲(chǔ)localStorage,sessionStorage,cookie,indexDB的用法與使用場(chǎng)景匯總
在JavaScript中,本地存儲(chǔ)是一種在用戶的瀏覽器上存儲(chǔ)數(shù)據(jù)的方式,它允許網(wǎng)頁(yè)在不與服務(wù)器進(jìn)行額外數(shù)據(jù)傳輸?shù)那闆r下保留跨會(huì)話信息。主要有三種本地存儲(chǔ)方式:sessionStorage、localStorage、cookie與indexDB。
javaScript有4種數(shù)據(jù)存儲(chǔ)方式,分別是:
- sessionStorage
- localStorage
- cookier
- indexDB
一. javaScript本地存儲(chǔ)之 sessionStorage
sessionStorage僅在當(dāng)前會(huì)話下有效,關(guān)閉頁(yè)面或?yàn)g覽器后被清除,也就是說sessionStorage只存在于窗口(頁(yè)面)活躍期,一旦窗口關(guān)閉,sessionStorage將會(huì)刪除數(shù)據(jù)。
sessionStorage的方法有以下幾個(gè)
- setItem(key,value) 設(shè)置數(shù)據(jù)
- getItem(key) 獲取數(shù)據(jù)
- removeItem(key) 移除數(shù)據(jù)
- clear() 清除所有值
sessionStorage實(shí)例:
// 添加數(shù)據(jù) window.sessionStorage.setItem("name","李四") window.sessionStorage.setItem("age",18) // 獲取數(shù)據(jù) console.log(window.sessionStorage.getItem("name")) // 李四 // 清除某個(gè)數(shù)據(jù) window.sessionStorage.removeItem("gender") // 清空所有數(shù)據(jù) window.sessionStorage.clear()
二. javaScript本地存儲(chǔ)之 localStorage
localStorage是HTML5中引入的技術(shù),用于在用戶的瀏覽器上長(zhǎng)期存儲(chǔ)數(shù)據(jù),直到用戶手動(dòng)刪除。與sessionStorage類似,但localStorage存儲(chǔ)的數(shù)據(jù)沒有過期時(shí)間。它同樣提供了setItem、getItem、removeItem和clear方法來(lái)操作數(shù)據(jù)。
localStorage的方法有以下幾個(gè)
- setItem(key,value) 設(shè)置數(shù)據(jù)
- getItem(key) 獲取數(shù)據(jù)
- removeItem(key) 移除數(shù)據(jù)
- clear() 清除所有值
// 存儲(chǔ)數(shù)據(jù) localStorage.setItem("name", "張三"); localStorage.setItem("age", 20); localStorage.setItem("gender", "男"); // 獲取數(shù)據(jù) console.log(localStorage.getItem("name")); // 輸出: 張三 // 刪除數(shù)據(jù) localStorage.removeItem("gender"); // 清除所有數(shù)據(jù) localStorage.clear();
localStorage還可以通過添加時(shí)間戳和過期時(shí)間來(lái)手動(dòng)設(shè)置數(shù)據(jù)的失效時(shí)間。由于localStorage只能存儲(chǔ)字符串,因此在存儲(chǔ)對(duì)象時(shí)需要將其轉(zhuǎn)換為JSON字符串,并在讀取時(shí)解析。
Storage.prototype.setExpire = (key, value, expire) => { let obj = { data: value, time: Date.now(), expire: expire }; //localStorage 設(shè)置的值不能為對(duì)象,轉(zhuǎn)為json字符串 localStorage.setItem(key, JSON.stringify(obj)); } Storage.prototype.getExpire = key => { let val = localStorage.getItem(key); if (!val) { return val; } val = JSON.parse(val); if (Date.now() - val.time > val.expire) { localStorage.removeItem(key); return null; } return val.data; } //使用方法 localStorage.setExpire('userId','zhangsan',5000); window.setInterval(()=>{ console.log(localStorage.getExpire("userId")); },1000)
- 總結(jié)
- 持久化存儲(chǔ),就算窗口關(guān)閉也依然保留,除非手動(dòng)刪除
- 頁(yè)面刷新數(shù)據(jù)不丟失
- 存儲(chǔ)范圍一般不超過5M
- 同一瀏覽器支持多窗口(多頁(yè)面)共享
- 假設(shè)同一個(gè)瀏覽器打開同源的三個(gè)頁(yè)面,.com/a.html;.com/b.html;**.com/c.html;那么這三個(gè)窗口是可以共享localstorage的
- 以鍵值對(duì)的形式保存
- 以localStorage.setItem(key,valueStr)保存值,valueStr必須是字符串,要存儲(chǔ)對(duì)象必須先字符串序列化,通過JSON.stringify(),取值的時(shí)候在通過JSON.parse()還原
- 以鍵取值
- 以value=localStorage.getItem(key)獲取值,如果不存在,返回null
- 受同源策略的限制
- 不同源的頁(yè)面不能訪問localStorage.比如在瀏覽器里面打開www.baidu.com/index.html存儲(chǔ)了一個(gè)localStorage;同樣在瀏覽器里面打開的www.ali.com/index.html就無(wú)法訪問到。因?yàn)樗麅刹煌?/li>
- 操作localstorage時(shí),會(huì)觸發(fā)非當(dāng)前頁(yè)面的storage事件
- 我們?cè)贏頁(yè)面設(shè)置了localStorage,就會(huì)觸發(fā)其他頁(yè)面的storage事件,這樣方便我們監(jiān)聽storage的狀態(tài),做出后續(xù)的響應(yīng)。比如在登錄頁(yè)完成登錄,把登錄成功的標(biāo)志logSuc存儲(chǔ)在localStorage里面,localStorage.setItem(‘logSuc’,true);然后個(gè)人中心頁(yè)面就可以通過storage事件判斷出已經(jīng)登錄,并讀取個(gè)人信息進(jìn)行預(yù)加載
- 支持單個(gè)刪除和全部刪除,分別通過removeItem(key)和clear()方法實(shí)現(xiàn)
三. javaScript本地存儲(chǔ)之 cookie
- Cookie 是一些數(shù)據(jù), 存儲(chǔ)于你電腦上的文本文件中,用于存儲(chǔ) web 頁(yè)面的用戶信息
- Cookie 數(shù)據(jù)是以鍵值對(duì)的形式存在的,每個(gè)鍵值對(duì)都有過期時(shí)間。如果不設(shè)置時(shí)間,瀏覽器關(guān)閉,cookie就會(huì)消失,當(dāng)然用戶也可以手動(dòng)清除cookie
- Cookie每次都會(huì)攜帶在HTTP頭中,如果使用cookie保存過多數(shù)據(jù)會(huì)帶來(lái)性能問題
- Cookie內(nèi)存大小受限,一般每個(gè)域名下是4K左右,每個(gè)域名大概能存儲(chǔ)50個(gè)鍵值對(duì)
通過訪問document.cookie可以對(duì)cookie進(jìn)行創(chuàng)建,修改與獲取。默認(rèn)情況下,cookie 在瀏覽器關(guān)閉時(shí)刪除,你還可以為 cookie的某個(gè)鍵值對(duì) 添加一個(gè)過期時(shí)間,如果設(shè)置新的cookie時(shí),某個(gè)key已經(jīng)存在,則會(huì)更新這個(gè)key對(duì)應(yīng)的值,否則他們會(huì)同時(shí)存在cookie中
// 設(shè)置cookie document.cookie = "username=orochiz" document.cookie = "age=20" // 讀取cookie var msg = document.cookie console.log(msg) // username=orochiz; age=20 // 添加過期時(shí)間(單位:天) var d = new Date() // 當(dāng)前時(shí)間 2019-9-25 var days = 3 // 3天 d.setDate(d.getDate() + days) document.cookie = "username=orochiz;"+"expires="+d // 刪除cookie (給某個(gè)鍵值對(duì)設(shè)置過期的時(shí)間) d.setDate(d.getDate() - 1) console.log(document.cookie)
四. javaScript本地存儲(chǔ)之 indexDB
- 前面講的存儲(chǔ)方式都是以字符串的形式在存儲(chǔ),假設(shè)我們現(xiàn)在的需求是要存儲(chǔ)大量結(jié)構(gòu)化的數(shù)據(jù)怎么辦,那就用indexDB
- 這是一個(gè)正兒八經(jīng)的數(shù)據(jù)庫(kù),做服務(wù)端的同學(xué)都了解數(shù)據(jù)庫(kù),這個(gè)跟數(shù)據(jù)庫(kù)沒啥的區(qū)別。只不過人家存在于客戶端而已。
- 那既然這樣,說明人家優(yōu)點(diǎn)很多,包括以下幾點(diǎn)
- 儲(chǔ)存量理論上沒有上限
- 所有操作都是異步的,相? LocalStorage 同步操作性能更?,尤其是數(shù)據(jù)量較?時(shí)
- 原??持儲(chǔ)存 JS 的對(duì)象
- 是個(gè)正經(jīng)的數(shù)據(jù)庫(kù),意味著數(shù)據(jù)庫(kù)能?的事它都能?-那他具體怎么操作呢,都說了人家是數(shù)據(jù)庫(kù),那就按數(shù)據(jù)庫(kù)的一般操作流程來(lái)唄
- 建立連接打開數(shù)據(jù)庫(kù),操作數(shù)據(jù)庫(kù)增刪改查,只不過可能為了更好地使用客戶端,可能某些步驟或者程序上做了一些微調(diào),那我們就實(shí)地操作一個(gè)
class DBOpration{ constructor() { this.db = null } getType(val) { let type = typeof val == 'object' return type } // 打開數(shù)據(jù)庫(kù) open(parm) { return new Promise((res, rej) => { let request = window.indexedDB.open(parm.dbName, parm.versions) request.onerror = function(event) { console.log(event) // 錯(cuò)誤處理 rej() console.log(' 打開數(shù)據(jù)庫(kù)報(bào)錯(cuò)') } request.onsuccess = event => { this.db = request.result console.log('打開數(shù)據(jù)庫(kù)成功') res() // 成功處理 } // 數(shù)據(jù)庫(kù)更新時(shí)的回調(diào) request.onupgradeneeded = event => { this.db = event.target.result this.createdDB(parm) } }) } // 創(chuàng)建庫(kù)表 createdDB(parm) { console.log(parm) if (!this.db.objectStoreNames.contains(parm.objName)) { this.db.createObjectStore(parm.objName, { keyPath: 'id' }) // objectStore.createIndex("data", "data", { unique: false }); // unique name可能會(huì)重復(fù) } } // 新增(不需要使用) async add(parm = { dbName, objName, param, response }) { await this.open(parm) // await this.upgrade(dbName); return new Promise((res, rej) => { let type = this.getType(parm.param) let type1 = this.getType(parm.response) let transaction = this.db.transaction([parm.objName], 'readwrite') let objectStore = transaction.objectStore(parm.objName) // 用戶讀取數(shù)據(jù),參數(shù)是主鍵 let request = objectStore.add({ id: type ? JSON.stringify(parm.param) : parm.param, data: type1 ? JSON.stringify(parm.response) : parm.response }) console.log(request) request.onsuccess = function(event) { res(event) console.log('數(shù)據(jù)寫入成功') } request.onerror = function(event) { rej() console.log('數(shù)據(jù)寫入失敗') } }) } // 讀取庫(kù)表數(shù)據(jù) async read(parm = { dbName, objName, param, response }) { await this.open(parm) return new Promise((res, rej) => { let type = this.getType(parm.param) var transaction = this.db.transaction([parm.objName]) var objectStore = transaction.objectStore(parm.objName) // 用戶讀取數(shù)據(jù),參數(shù)是主鍵 var request = objectStore.get(type ? JSON.stringify(parm.param) : parm.param) request.onerror = function(event) { console.log('事務(wù)失敗') rej() } request.onsuccess = function(event) { if (request.result) { let data = JSON.parse(request.result.data) res(data) } else { res(request.result) console.log('未獲得數(shù)據(jù)記錄') } } }) } // 修改庫(kù)表數(shù)據(jù),但是因?yàn)閯?chuàng)建數(shù)據(jù)庫(kù)時(shí)直接創(chuàng)建了庫(kù)表,所以無(wú)論是添加還是修改都掉這個(gè)就可以了. async update(parm = { dbName, objName, param, response }) { await this.open(parm) return new Promise((res, rej) => { let type = this.getType(parm.param) let type1 = this.getType(parm.response) console.log(parm) var request = this.db .transaction([parm.objName], 'readwrite') .objectStore(parm.objName) .put({ id: type ? JSON.stringify(parm.param) : parm.param, data: type1 ? JSON.stringify(parm.response) : parm.response }) request.onsuccess = function(event) { res() console.log('數(shù)據(jù)更新成功') } request.onerror = function(event) { rej() console.log('數(shù)據(jù)更新失敗') } }) } // 刪除某個(gè)表的數(shù)據(jù) async remove(parm = { dbName, objName, param, response }) { await this.open(parm) return new Promise((res, rej) => { let type = this.getType(parm.param) var request = this.db .transaction([parm.objName], 'readwrite') .objectStore(parm.objName) .delete(type ? JSON.stringify(parm.param) : parm.param) request.onsuccess = function(event) { res() console.log('數(shù)據(jù)刪除成功') } }) } } let db=new DBOpration()//創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例 //接下來(lái)增刪改查調(diào)取對(duì)應(yīng)的方法就行
總結(jié):localStorage,sessionStorage,cookie,indexDB不同存儲(chǔ)方式的使用場(chǎng)景
cookie,適用于標(biāo)記用戶與跟蹤用戶行為
localStorage,適用于長(zhǎng)期保存用戶的本地?cái)?shù)據(jù),比如token
sessionStorage,適合敏感賬號(hào)一次性登錄
indexDB,適合存儲(chǔ)大量結(jié)構(gòu)化數(shù)據(jù),比如富文本編輯器的編輯歷史保存等
這四種本地存儲(chǔ)方式都保存在瀏覽器端,但它們有以下不同點(diǎn):
cookie數(shù)據(jù)在每次HTTP請(qǐng)求中都會(huì)被發(fā)送到服務(wù)器,而sessionStorage和localStorage僅在本地保存。
cookie數(shù)據(jù)大小限制為4KB,而sessionStorage和localStorage可以達(dá)到5MB或更大。
sessionStorage僅在當(dāng)前會(huì)話有效,localStorage始終有效,cookie則在設(shè)置的過期時(shí)間之前有效。
sessionStorage不在不同的瀏覽器窗口中共享,而localStorage和cookie在所有同源窗口中共享。
- indexDB是數(shù)據(jù)庫(kù),可以儲(chǔ)存大量數(shù)據(jù),原??持儲(chǔ)存 JS 的對(duì)象,所有操作都是異步的,相? LocalStorage 同步操作性能更?
本地存儲(chǔ)提供了一種方便的方式來(lái)持久化用戶數(shù)據(jù),但需要注意的是,它們都遵循同源策略,不同的網(wǎng)站之間不能共用相同的存儲(chǔ)空間。此外,由于localStorage和sessionStorage僅支持字符串類型的存儲(chǔ),因此在存儲(chǔ)非字符串類型的數(shù)據(jù)時(shí)需要進(jìn)行類型轉(zhuǎn)換。
以上就是javascript中本地存儲(chǔ)的4種方式及用法與使用場(chǎng)景匯總的詳細(xì)內(nèi)容,更多關(guān)于javascript中本地存儲(chǔ)的4種方式及用法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript 詳解緩動(dòng)動(dòng)畫的封裝與使用
緩動(dòng)動(dòng)畫原理:移動(dòng)的像素慢慢減少,讓效果看起來(lái)更柔和更美觀,通過定時(shí)器加回調(diào)函數(shù),實(shí)現(xiàn)動(dòng)畫效果以及更多具體功能,非常好用2021-11-11JavaScript中isPrototypeOf、instanceof和hasOwnProperty函數(shù)的用法詳解
本文詳細(xì)講解了JavaScript中isPrototypeOf、instanceof和hasOwnProperty函數(shù)的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06Javascript & DHTML 實(shí)例編程(教程)DOM基礎(chǔ)和基本API
Javascript & DHTML 實(shí)例編程(教程)DOM基礎(chǔ)和基本API...2007-06-06鍵盤 keycode的值 javascript時(shí)觸發(fā)事件時(shí)很有用的要素
鍵盤keycode的值 編寫javascript時(shí)觸發(fā)事件時(shí)很有用的要素,大家可以收藏一下。2009-11-11JavaScript中的getMilliseconds()方法使用詳解
這篇文章主要介紹了JavaScript中的getMilliseconds()方法使用詳解,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06javascript獲得當(dāng)前的信息的一些常用命令
這篇文章主要介紹了javascript獲得當(dāng)前的信息的一些常用命令,需要的朋友可以參考下2015-02-02說說掌握J(rèn)avaScript語(yǔ)言的思想前提想學(xué)習(xí)js的朋友可以看看
無(wú)論是公司的同事還是外界的程序員朋友們,大部分人對(duì)JavaScript的高級(jí)應(yīng)用不甚了解,已有的知識(shí)架構(gòu)里會(huì)認(rèn)為JavaScript僅僅是一門腳本語(yǔ)言,其作用是給頁(yè)面做一些錦上添花的效果,比如表單驗(yàn)證等等。2009-04-04