欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript中本地存儲(chǔ)localStorage,sessionStorage,cookie,indexDB的用法與使用場(chǎng)景匯總

 更新時(shí)間:2025年02月01日 09:31:25   投稿:wdc  
一文講清楚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)文章

最新評(píng)論