基础知识

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > 基础知识 > javascript中本地存储的4种方式及用法

javascript中本地存储localStorage,sessionStorage,cookie,indexDB的用法与使用场景汇总

投稿:wdc

一文讲清楚javascript 本地存储localStorage,sessionStorage,cookie,indexDB的使用方法,以及各自的使用场景

在JavaScript中,本地存储是一种在用户的浏览器上存储数据的方式,它允许网页在不与服务器进行额外数据传输的情况下保留跨会话信息。主要有三种本地存储方式:sessionStorage、localStorage、cookie与indexDB。

javaScript有4种数据存储方式,分别是:

一. javaScript本地存储之 sessionStorage

sessionStorage仅在当前会话下有效,关闭页面或浏览器后被清除,也就是说sessionStorage只存在于窗口(页面)活跃期,一旦窗口关闭,sessionStorage将会删除数据。

sessionStorage的方法有以下几个

sessionStorage实例:

// 添加数据
window.sessionStorage.setItem("name","李四")
window.sessionStorage.setItem("age",18)

// 获取数据
console.log(window.sessionStorage.getItem("name")) // 李四

// 清除某个数据
window.sessionStorage.removeItem("gender")

// 清空所有数据
window.sessionStorage.clear()

二. javaScript本地存储之 localStorage

localStorage是HTML5中引入的技术,用于在用户的浏览器上长期存储数据,直到用户手动删除。与sessionStorage类似,但localStorage存储的数据没有过期时间。它同样提供了setItem、getItem、removeItem和clear方法来操作数据。

localStorage的方法有以下几个

// 存储数据
localStorage.setItem("name", "张三");
localStorage.setItem("age", 20);
localStorage.setItem("gender", "男");

// 获取数据
console.log(localStorage.getItem("name")); // 输出: 张三

// 删除数据
localStorage.removeItem("gender");

// 清除所有数据
localStorage.clear();

localStorage还可以通过添加时间戳和过期时间来手动设置数据的失效时间。由于localStorage只能存储字符串,因此在存储对象时需要将其转换为JSON字符串,并在读取时解析。

Storage.prototype.setExpire = (key, value, expire) => {
	let obj = {
	data: value,
	time: Date.now(),
	expire: expire
	};
	//localStorage 设置的值不能为对象,转为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)

三. javaScript本地存储之 cookie

通过访问document.cookie可以对cookie进行创建,修改与获取。默认情况下,cookie 在浏览器关闭时删除,你还可以为 cookie的某个键值对 添加一个过期时间,如果设置新的cookie时,某个key已经存在,则会更新这个key对应的值,否则他们会同时存在cookie中 

// 设置cookie
document.cookie = "username=orochiz"
document.cookie = "age=20"

// 读取cookie
var msg = document.cookie
console.log(msg) // username=orochiz; age=20

// 添加过期时间(单位:天)
var d = new Date() // 当前时间 2019-9-25
var days = 3       // 3天
d.setDate(d.getDate() + days)
document.cookie = "username=orochiz;"+"expires="+d

// 删除cookie (给某个键值对设置过期的时间)
d.setDate(d.getDate() - 1)
console.log(document.cookie)

四. javaScript本地存储之 indexDB

class DBOpration{
        constructor() {
            this.db = null
        }
        getType(val) {
            let type = typeof val == 'object'
            return type
        }
        // 打开数据库
        open(parm) {
            return new Promise((res, rej) => {
                let request = window.indexedDB.open(parm.dbName, parm.versions)
                request.onerror = function(event) {
                    console.log(event)
                    // 错误处理
                    rej()
                    console.log(' 打开数据库报错')
                }
                request.onsuccess = event => {
                    this.db = request.result
                    console.log('打开数据库成功')
                    res()
                    // 成功处理
                }
                // 数据库更新时的回调
                request.onupgradeneeded = event => {
                    this.db = event.target.result
                    this.createdDB(parm)
                }
            })
        }
        // 创建库表
        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可能会重复
            }
        }
        // 新增(不需要使用)
        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)

                // 用户读取数据,参数是主键
                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('数据写入成功')
                }

                request.onerror = function(event) {
                    rej()
                    console.log('数据写入失败')
                }
            })
        }
        // 读取库表数据
        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)
                // 用户读取数据,参数是主键
                var request = objectStore.get(type ? JSON.stringify(parm.param) : parm.param)

                request.onerror = function(event) {
                    console.log('事务失败')
                    rej()
                }

                request.onsuccess = function(event) {
                    if (request.result) {
                        let data = JSON.parse(request.result.data)
                        res(data)
                    } else {
                        res(request.result)
                        console.log('未获得数据记录')
                    }
                }
            })
        }
        // 修改库表数据,但是因为创建数据库时直接创建了库表,所以无论是添加还是修改都掉这个就可以了.
        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('数据更新成功')
                }

                request.onerror = function(event) {
                    rej()
                    console.log('数据更新失败')
                }
            })
        }
        // 删除某个表的数据
        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('数据删除成功')
                }
            })
        }
    }
let db=new DBOpration()//创建数据库实例
//接下来增删改查调取对应的方法就行

 总结:localStorage,sessionStorage,cookie,indexDB不同存储方式的使用场景

这四种本地存储方式都保存在浏览器端,但它们有以下不同点:

本地存储提供了一种方便的方式来持久化用户数据,但需要注意的是,它们都遵循同源策略,不同的网站之间不能共用相同的存储空间。此外,由于localStorage和sessionStorage仅支持字符串类型的存储,因此在存储非字符串类型的数据时需要进行类型转换。

以上就是javascript中本地存储的4种方式及用法与使用场景汇总的详细内容,更多关于javascript中本地存储的4种方式及用法的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文