localstorage 本地存储

简介: define(function() { var win = window, doc = document, decode = function(s) { // 参考jquery cookie的实现: https://github.com/carhartl/jquery-cookie/blob/master
define(function() {  
    var win = window,  
        doc = document,  
  
        decode = function(s) {  
            // 参考jquery cookie的实现: https://github.com/carhartl/jquery-cookie/blob/master/jquery.cookie.js  
            if (s.indexOf('"') === 0) {  
                s = s.slice(1, - 1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');  
            }  
            try {  
                return decodeURIComponent(s);  
            } catch (e) {  
                return null;  
            }  
        },  
        encode = encodeURIComponent,  
  
        isSupportLocalStorage = (function() {  
            try {  
                var support = 'localStorage' in win && win['localStorage'] !== null,  
                    test = {  
                        k: 'test key',  
                        v: 'test value'  
                    };  
                if (support) {  
                    localStorage.setItem(test.k, test.v);  
                    support = test.v === localStorage.getItem(test.k);  
                }  
                return support;  
            } catch (e) {  
                return false;  
            }  
        }()),  
  
        stringify = function(v) {  
            if (!_.isString(v)) {  
                v = JSON.stringify(v);  
            }  
            return encode(v);  
        },  
  
        validateCookieName = function(name) {  
            if (!_.isString(name) || name === '') {  
                throw new TypeError('Cookie name must be a non-empty string!');  
            }  
        },  
  
        // TODO: 不支持localStorage时换用cookie存储  
        // 现在在某些浏览器下可能存在cookie数量的限制  
        // 之后可能的优化是使用subcookie的方式: https://developer.yahoo.com/yui/cookie/#subcookies  
        s = isSupportLocalStorage ? localStorage : {  
            setItem: function(k, v, days) {  
                validateCookieName(k);  
  
                // 默认cookie中的结果缓存7天  
                days = days || 7;  
                var expires = new Date();  
                expires.setDate(expires.getDate() + days);  
  
                v = _m.utils.evaluate(v);  
                if (_.isArray(v)) {  
                    v = v[0];  
                    expires = new Date(parseInt(v[1], 10));  
                }  
  
                k = stringify(k);  
                v = stringify(v);  
  
                // 高端浏览器中一般合并字符用+比用join('')更高效  
                // 参考: http://photo.weibo.com/2785671884/wbphotos/large/photo_id/3453950944633013?refer=weibofeedv5  
                doc.cookie = k + '=' + v + '; expires=' + expires.toGMTString();  
            },  
  
            getItem: function(k) {  
                validateCookieName(k);  
  
                k = stringify(k) + '=';  
  
                var v = null,  
                    cookie = doc.cookie,  
                    start = cookie.indexOf(k);  
  
                if (start > -1) {  
                    var end = cookie.indexOf(';', start);  
                    if (end === -1) {  
                        end = cookie.length;  
                    }  
                    v = decode(cookie.substring(start + k.length, end));  
                }  
  
                return v;  
            },  
  
            removeItem: function(k) {  
                this.setItem(k, '', - 1);  
            }  
        },  
  
        prefix = '_BM:';  
  
    return {  
        isSupportLocalStorage: isSupportLocalStorage,  
  
        set: function(k, v, expires) {  
            if (_.isNumber(expires)) {  
                expires = +new Date() + expires;  
            }  
            s.setItem(prefix + k, JSON.stringify({  
                value: v,  
                expires: expires  
            }));  
        },  
  
        get: function(k) {  
            var v = JSON.parse(s.getItem(prefix + k)),  
                expires;  
  
            if (!v) {  
                return;  
            }  
  
            expires = parseInt(v.expires, 10);  
            v = v.value;  
  
            if (expires) {  
                if (+new Date() < expires) {  
                    return v;  
                }  
                this.remove(k);  
            }  
  
            return v;  
        },  
  
        remove: function(k, v) {  
            if (v) {  
                try {  
                    this.set(k, _.difference(this.get(k), v));  
                } catch (e) {}  
            } else {  
                s.removeItem(prefix + k);  
            }  
        },  
  
        add: function(k, v, options) {  
            var h = this.get(k),  
  
                defaults = {  
                    type: 'set',  
                    limit: 10  
                },  
                opts = _.extend(defaults, options),  
  
                type = opts.type,  
                expires = opts.expires,  
                limit = opts.limit;  
  
            // TODO: 有潜在的bug, 比如之前存储的是array类型  
            if (!_.isArray(h)) {  
                h = _.isUndefined(h) && [] || [h];  
            }  
  
            if (type === 'set' && _.indexOf(h, v) !== -1) {  
                return;  
            }  
  
            if (_.isNumber(limit) && limit > 0) {  
                h = _.first(h, limit - 1);  
            }  
  
            h.unshift(v);  
  
            this.set(k, h, expires);  
        }  
    };  
});  
   

目录
相关文章
|
存储 缓存 算法
[转]分布式唯一ID生成方案
分布式唯一ID生成方案
443 0
[转]分布式唯一ID生成方案
|
数据可视化 编译器 开发工具
RISC-V MCU开发 (一):MounRiver Studio集成开发环境
近年来,RISC-V生态获得了空前的繁荣发展,国内外众多科技公司纷纷下场布局、行业应用层出不穷,搭载RISC-V内核的MCU也逐渐走入了工程师的日常开发工作中。 工欲善其事必先利其器,要想实现基于RISC-V MCU的项目开发,与之配套的集成开发环境必不可少。目前市场上可供选择的RISC-V MCU开发工具已初具规模,由MounRiver团队打造的MounRiver® Studio(MRS)便是其中一种。
RISC-V MCU开发 (一):MounRiver Studio集成开发环境
|
存储 自然语言处理 Java
|
人工智能 自然语言处理 安全
如何通过网关降低大模型的调用费用,并提升合规性
如何通过网关降低大模型的调用费用,并提升合规性
909 102
|
SQL 消息中间件 关系型数据库
使用Flink SQL实现对连续的异常告警进行合并
使用Flink SQL实现对连续的异常告警进行合并
445 40
|
SQL Oracle 关系型数据库
第三范式(3NF)
第三范式(3NF)是关系数据库设计中的规范化级别之一。它建立在第一范式(1NF)和第二范式(2NF)的基础上
1017 1
|
存储 缓存 算法
[译] OpenSSL 3.0.0 设计
本文翻译 OpenSSL 官网文档:https://www.openssl.org/docs/OpenSSL300Design.htmlTongsuo-8.4.0 是基于 OpenSSL-3.0.3 开发,所以本文对 Tongsuo 开发者同样适用,内容丰富,值得一读!介绍本文概述了 OpenSSL 3.0 的设计,这是在 1.1.1 版本之后的 OpenSSL 的下一个版本。假设读者熟悉名为 &
573 0
[译] OpenSSL 3.0.0 设计
|
机器学习/深度学习 存储 传感器
小白必看的经典机器学习入门项目
小白必看的经典机器学习入门项目
556 0
小白必看的经典机器学习入门项目
|
安全 Linux 数据安全/隐私保护
Linux文件访问权限检查与修改:基于access函数的实现
在Linux系统中,文件访问权限是非常重要的概念,它决定了用户对文件的读、写和执行权限。为了确保文件安全和数据保护,我们经常需要检查和修改文件的访问权限。本文将详细介绍Linux下基于`access`函数的文件访问权限检查和修改方法,并提供代码示例,帮助读者深入了解文件权限管理。
925 0
|
PHP
php开发实战分析(3):php中判断变量为空(0、false、null)的方法
php开发实战分析(3):php中判断变量为空(0、false、null)的方法
464 0