javascript中本地存儲(chǔ)localStorage,sessionStorage,cookie,indexDB的用法與使用場(chǎng)景匯總
在JavaScript中,本地存儲(chǔ)是一種在用戶(hù)的瀏覽器上存儲(chǔ)數(shù)據(jù)的方式,它允許網(wǎng)頁(yè)在不與服務(wù)器進(jìn)行額外數(shù)據(jù)傳輸?shù)那闆r下保留跨會(huì)話(huà)信息。主要有三種本地存儲(chǔ)方式:sessionStorage、localStorage、cookie與indexDB。
javaScript有4種數(shù)據(jù)存儲(chǔ)方式,分別是:
- sessionStorage
- localStorage
- cookier
- indexDB
一. javaScript本地存儲(chǔ)之 sessionStorage
sessionStorage僅在當(dāng)前會(huì)話(huà)下有效,關(guān)閉頁(yè)面或?yàn)g覽器后被清除,也就是說(shuō)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ù),用于在用戶(hù)的瀏覽器上長(zhǎng)期存儲(chǔ)數(shù)據(jù),直到用戶(hù)手動(dòng)刪除。與sessionStorage類(lèi)似,但localStorage存儲(chǔ)的數(shù)據(jù)沒(méi)有過(guò)期時(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還可以通過(guò)添加時(shí)間戳和過(guò)期時(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ǔ)范圍一般不超過(guò)5M
- 同一瀏覽器支持多窗口(多頁(yè)面)共享
- 假設(shè)同一個(gè)瀏覽器打開(kāi)同源的三個(gè)頁(yè)面,.com/a.html;.com/b.html;**.com/c.html;那么這三個(gè)窗口是可以共享localstorage的
- 以鍵值對(duì)的形式保存
- 以localStorage.setItem(key,valueStr)保存值,valueStr必須是字符串,要存儲(chǔ)對(duì)象必須先字符串序列化,通過(guò)JSON.stringify(),取值的時(shí)候在通過(guò)JSON.parse()還原
- 以鍵取值
- 以value=localStorage.getItem(key)獲取值,如果不存在,返回null
- 受同源策略的限制
- 不同源的頁(yè)面不能訪問(wèn)localStorage.比如在瀏覽器里面打開(kāi)www.baidu.com/index.html存儲(chǔ)了一個(gè)localStorage;同樣在瀏覽器里面打開(kāi)的www.ali.com/index.html就無(wú)法訪問(wèn)到。因?yàn)樗麅刹煌?/li>
- 操作localstorage時(shí),會(huì)觸發(fā)非當(dāng)前頁(yè)面的storage事件
- 我們?cè)贏頁(yè)面設(shè)置了localStorage,就會(huì)觸發(fā)其他頁(yè)面的storage事件,這樣方便我們監(jiān)聽(tīng)storage的狀態(tài),做出后續(xù)的響應(yīng)。比如在登錄頁(yè)完成登錄,把登錄成功的標(biāo)志logSuc存儲(chǔ)在localStorage里面,localStorage.setItem(‘logSuc’,true);然后個(gè)人中心頁(yè)面就可以通過(guò)storage事件判斷出已經(jīng)登錄,并讀取個(gè)人信息進(jìn)行預(yù)加載
- 支持單個(gè)刪除和全部刪除,分別通過(guò)removeItem(key)和clear()方法實(shí)現(xiàn)
三. javaScript本地存儲(chǔ)之 cookie
- Cookie 是一些數(shù)據(jù), 存儲(chǔ)于你電腦上的文本文件中,用于存儲(chǔ) web 頁(yè)面的用戶(hù)信息
- Cookie 數(shù)據(jù)是以鍵值對(duì)的形式存在的,每個(gè)鍵值對(duì)都有過(guò)期時(shí)間。如果不設(shè)置時(shí)間,瀏覽器關(guān)閉,cookie就會(huì)消失,當(dāng)然用戶(hù)也可以手動(dòng)清除cookie
- Cookie每次都會(huì)攜帶在HTTP頭中,如果使用cookie保存過(guò)多數(shù)據(jù)會(huì)帶來(lái)性能問(wèn)題
- Cookie內(nèi)存大小受限,一般每個(gè)域名下是4K左右,每個(gè)域名大概能存儲(chǔ)50個(gè)鍵值對(duì)
通過(guò)訪問(wèn)document.cookie可以對(duì)cookie進(jìn)行創(chuàng)建,修改與獲取。默認(rèn)情況下,cookie 在瀏覽器關(guān)閉時(shí)刪除,你還可以為 cookie的某個(gè)鍵值對(duì) 添加一個(gè)過(guò)期時(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 // 添加過(guò)期時(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è)置過(guò)期的時(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ù)沒(méi)啥的區(qū)別。只不過(guò)人家存在于客戶(hù)端而已。
- 那既然這樣,說(shuō)明人家優(yōu)點(diǎn)很多,包括以下幾點(diǎn)
- 儲(chǔ)存量理論上沒(méi)有上限
- 所有操作都是異步的,相? LocalStorage 同步操作性能更?,尤其是數(shù)據(jù)量較?時(shí)
- 原??持儲(chǔ)存 JS 的對(duì)象
- 是個(gè)正經(jīng)的數(shù)據(jù)庫(kù),意味著數(shù)據(jù)庫(kù)能?的事它都能?-那他具體怎么操作呢,都說(shuō)了人家是數(shù)據(jù)庫(kù),那就按數(shù)據(jù)庫(kù)的一般操作流程來(lái)唄
- 建立連接打開(kāi)數(shù)據(jù)庫(kù),操作數(shù)據(jù)庫(kù)增刪改查,只不過(guò)可能為了更好地使用客戶(hù)端,可能某些步驟或者程序上做了一些微調(diào),那我們就實(shí)地操作一個(gè)
class DBOpration{ constructor() { this.db = null } getType(val) { let type = typeof val == 'object' return type } // 打開(kāi)數(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(' 打開(kāi)數(shù)據(jù)庫(kù)報(bào)錯(cuò)') } request.onsuccess = event => { this.db = request.result console.log('打開(kāi)數(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) // 用戶(hù)讀取數(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ù)寫(xiě)入成功') } request.onerror = function(event) { rej() console.log('數(shù)據(jù)寫(xiě)入失敗') } }) } // 讀取庫(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) // 用戶(hù)讀取數(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)記用戶(hù)與跟蹤用戶(hù)行為
localStorage,適用于長(zhǎng)期保存用戶(hù)的本地?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ì)話(huà)有效,localStorage始終有效,cookie則在設(shè)置的過(guò)期時(shí)間之前有效。
sessionStorage不在不同的瀏覽器窗口中共享,而localStorage和cookie在所有同源窗口中共享。
- indexDB是數(shù)據(jù)庫(kù),可以?xún)?chǔ)存大量數(shù)據(jù),原??持儲(chǔ)存 JS 的對(duì)象,所有操作都是異步的,相? LocalStorage 同步操作性能更?
本地存儲(chǔ)提供了一種方便的方式來(lái)持久化用戶(hù)數(shù)據(jù),但需要注意的是,它們都遵循同源策略,不同的網(wǎng)站之間不能共用相同的存儲(chǔ)空間。此外,由于localStorage和sessionStorage僅支持字符串類(lèi)型的存儲(chǔ),因此在存儲(chǔ)非字符串類(lèi)型的數(shù)據(jù)時(shí)需要進(jìn)行類(lèi)型轉(zhuǎn)換。
以上就是javascript中本地存儲(chǔ)的4種方式及用法與使用場(chǎng)景匯總的詳細(xì)內(nèi)容,更多關(guān)于javascript中本地存儲(chǔ)的4種方式及用法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
javascript開(kāi)發(fā)技術(shù)大全 第4章 直接量與字符集
直接量就是在程序中顯示出來(lái)的數(shù)值。javascript直接量包括:字符串、數(shù)字、布爾、數(shù)組、函數(shù)、對(duì)象、和特殊直接2011-07-07JavaScript入門(mén)教程(6) Window窗口對(duì)象
他是JavaScript中最大的對(duì)象,它描述的是一個(gè)瀏覽器窗口。一般要引用它的屬性和方法時(shí),不需要用“window.xxx”這種形式,而直接使用“xxx”。一個(gè)框架頁(yè)面也是一個(gè)窗口。2009-01-01javascript中的對(duì)象和數(shù)組的應(yīng)用技巧
javascript中的對(duì)象和數(shù)組的應(yīng)用技巧...2007-01-01使用js聲明數(shù)組,對(duì)象在jsp頁(yè)面中(獲得ajax得到j(luò)son數(shù)據(jù))
使用js聲明數(shù)組,對(duì)象在jsp頁(yè)面中(獲得ajax得到j(luò)son數(shù)據(jù))。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11張孝祥JavaScript學(xué)習(xí)階段性總結(jié)(2)--(X)HTML學(xué)習(xí)
張孝祥JavaScript學(xué)習(xí)階段性總結(jié)(2)--(X)HTML學(xué)習(xí)...2007-02-02