localStorage sessionStorage 增强版

Posted Sorrow.X

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了localStorage sessionStorage 增强版相关的知识,希望对你有一定的参考价值。

1. 保留了localStorage sessionStorage的(setItem getItem removeItem clear key)api,使用上几乎差不多
2. 增强了setItem方法,增强版的可以设置值为undefined null array object string number类型的值
3. 增加了(has getAll forEach)api

源码如下

/**
 * Created by Sorrow.X on 2018/3/30.
 * 本地存储实现, 封装localStorage和sessionStorage
 */

;(function() {
    const api = {
        setItem(key, val) {
            if (tip(arguments, \'setItem\', 2)) { return }
            this.storage.setItem(key, serialize(val))
            return val
        },

        getItem(key, defaultVal) {
            if (tip(arguments, \'getItem\', 1)) { return }
            // 如果没有该key, 则自动设置到缓存中去, 默认值为null
            if (!this.has(key)) {
                return this.setItem(key, defaultVal || null)
            }
            let ret = deserialize(this.storage.getItem(key))
            // 如果有该key,但是值为undefined或者null,则使用默认值且设置到缓存去
            if (defaultVal && (ret === undefined || ret === null)) {
                ret = this.setItem(key, defaultVal)
            }
            return ret
        },

        removeItem(key) {
            if (tip(arguments, \'removeItem\', 1)) { return }
            this.storage.removeItem(key)
        },

        clear() {
            this.storage.clear()
        },

        key(index) {
            if (tip(arguments, \'key\', 1)) { return }
            this.storage.key(index)
        },

        has(key) {
            if (tip(arguments, \'has\', 1)) { return }
            // 使用原生getItem方法,如果没有该key会返回字符串"null"
            return this.storage.getItem(key) !== null
        },

        getAll() {
            let map = Object.create(null)
            this.forEach((key, val) => {
                map[key] = val
            })
            return map
        },

        forEach(callback, ctx) {
            for (let i = 0; i < this.storage.length; i++) {
                let key = this.storage.key(i)
                callback && callback.call(ctx, key, this.getItem(key), i)
            }
        }
    }

    let local = Object.assign({
        storage: window.localStorage
    }, api)

    let session = Object.assign({
        storage: window.sessionStorage
    }, api)

    function serialize(val) {
        return JSON.stringify(val)
    }

    function deserialize(val) {
        try {
            return JSON.parse(val)
        } catch (e) {
            return val === "undefined" ? undefined : val
        }
    }

    function tip(args, operation, actualNum) {
        if (args.length < actualNum) {
            console.error(
                `Failed to execute \'${operation}\' on \'store\': ${actualNum} arguments required, but only ${args.length} present.`
            )
            return true;
        } else {
            return false;
        }
    }

    if (
        typeof module !== \'undefined\' &&
        typeof exports === \'object\'
    ) {
        module.exports = { local, session }
    } else {
        window.local = local
        window.session = session
    }
})();

 

 

使用姿势(和原生对比):

        // 原生
        localStorage.setItem(\'num\', 1)
        localStorage.setItem(\'str\', \'str\')
        localStorage.setItem(\'arr\', [1, 2, 3])
        localStorage.setItem(\'obj\', {a: 1, b: 2, c: 3})
        localStorage.setItem(\'undefined\', undefined)
        localStorage.setItem(\'null\', null)

        console.log(localStorage.getItem(\'test\'), Object.prototype.toString.call(localStorage.getItem(\'test\')))
        console.log(localStorage.getItem(\'num\'), Object.prototype.toString.call(localStorage.getItem(\'num\')))
        console.log(localStorage.getItem(\'str\'), Object.prototype.toString.call(localStorage.getItem(\'str\')))
        console.log(localStorage.getItem(\'arr\'), Object.prototype.toString.call(localStorage.getItem(\'arr\')))
        console.log(localStorage.getItem(\'obj\'), Object.prototype.toString.call(localStorage.getItem(\'obj\')))
        console.log(localStorage.getItem(\'undefined\'), Object.prototype.toString.call(localStorage.getItem(\'undefined\')))
        console.log(localStorage.getItem(\'null\'), Object.prototype.toString.call(localStorage.getItem(\'null\')))


        // 增强版
        local.setItem(\'__num__\', 1)
        local.setItem(\'__str__\', \'str\')
        local.setItem(\'__arr__\', [1, 2, 3])
        local.setItem(\'__obj__\', {a: 1, b: 2, c: 3})
        local.setItem(\'__undefined__\', undefined)
        local.setItem(\'__null__\', null)

        console.log(local.getItem(\'__test__\'), Object.prototype.toString.call(local.getItem(\'__test__\')))
        console.log(local.getItem(\'__num__\'), Object.prototype.toString.call(local.getItem(\'__num__\')))
        console.log(local.getItem(\'__str__\'), Object.prototype.toString.call(local.getItem(\'__str__\')))
        console.log(local.getItem(\'__arr__\'), Object.prototype.toString.call(local.getItem(\'__arr__\')))
        console.log(local.getItem(\'__obj__\'), Object.prototype.toString.call(local.getItem(\'__obj__\')))
        console.log(local.getItem(\'__undefined__\'), Object.prototype.toString.call(local.getItem(\'__undefined__\')))
        console.log(local.getItem(\'__null__\'), Object.prototype.toString.call(local.getItem(\'__null__\')))

上图结果截图:

 

以上是关于localStorage sessionStorage 增强版的主要内容,如果未能解决你的问题,请参考以下文章

localstorage不刷新无法读取

html5 localstorage能存多少

如何避免localStorage存储的值被修改

localstorage的跨域存储方案

关于localStorage 应用总结

android html5 localstorage某手机从localstorage中取不到数据