最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

給localStorage設(shè)置一個(gè)過期時(shí)間的方法分享

 更新時(shí)間:2018年11月06日 11:20:18   作者:蘇南  
我們都知道localStorage不主動(dòng)刪除,永遠(yuǎn)不會(huì)銷毀,那么如何設(shè)置localStorage的過期時(shí)間呢?下面這篇文章主要給大家介紹了關(guān)于如何給localStorage設(shè)置一個(gè)過期時(shí)間的相關(guān)資料,需要的朋友可以參考下

思考點(diǎn)

在 web 開發(fā)中,我們知道 cookie、session、localStorage都可以保存用戶的數(shù)據(jù),cookie的 domain、path 限制了 cookie 的跨域, 有數(shù)量和大小的限制,可以設(shè)置有效時(shí)間。 session是后臺在瀏覽器注入一個(gè)設(shè)置了 httponly 的不可讀取的 cookie , session data由后臺保存在數(shù)據(jù)庫或者內(nèi)存中,在web中,session 是靠 cookie 作為唯一標(biāo)示來實(shí)現(xiàn)的,也可以設(shè)置過期時(shí)間。 localStorage 是 H5 的數(shù)據(jù)存儲辦法, 也是有大小限制的,但是不可以設(shè)置過期時(shí)間。

從我們接觸前端起,第一個(gè)熟悉的存儲相關(guān)的Cookie或者來分析我們生活中密切相關(guān)的淘寶、物流、鬧鐘等事物來說起吧,

  • Cookie從你設(shè)置的時(shí)候,就會(huì)給個(gè)時(shí)間,不設(shè)置默認(rèn)會(huì)話結(jié)束就過期;
  • 淘寶購物 從你下單付款起,就會(huì)給這件貨物設(shè)置一個(gè)收貨期限時(shí)間,過了這個(gè)時(shí)間自動(dòng)認(rèn)為你收貨(即訂單結(jié)束);
  • 鬧鐘 你設(shè)置的提醒時(shí)間,其實(shí)也就是它的過期時(shí)間;
  • 再比如與您每天切身相關(guān)的產(chǎn)品需求,過完需求,你給出的上線時(shí)間,也就是這個(gè)需求的過期時(shí)間;
  • 再通俗點(diǎn)講,您今年的生日過完到明年生日之間也是相當(dāng)于設(shè)置了有效期時(shí)間;

以上種種,我們能得出一個(gè)結(jié)論任何一件事、一個(gè)行為動(dòng)作,都有一個(gè)時(shí)間、一個(gè)節(jié)點(diǎn),甚至我們可以黑localStorage,就是一個(gè)完善的API,為什么不能給一個(gè)設(shè)置過期的機(jī)制,因?yàn)閟essionStorage、Cookie并不能滿足我們實(shí)際的需求。

實(shí)現(xiàn)思路

抱歉,黑localStorage不完善,有點(diǎn)夸張了,綜合上述的總結(jié),問題就簡單了,給localStorage一個(gè)過期時(shí)間,一切就都so easy ?到底是不是,來看看具體的實(shí)現(xiàn)吧:

簡單回顧

//示例一:
localStorage.setItem('test',1234567);
let test = localStorage.getItem('test');
console.log(typeof test, test);

//示例二:
localStorage['name'] = '蘇南';
console.log(localStorage['name']);
/*
輸出:
"1234567" ,'蘇南',
這里要注意,1234567 存進(jìn)去時(shí)是number 取出來就成string了
*/

重寫 set(存入) 方法:

  • 首先有三個(gè)參數(shù) key、value、expired ,分別對應(yīng) 鍵、值、過期時(shí)間,
  • 過期時(shí)間的單位可以自由發(fā)揮,小時(shí)、分鐘、天都可以,
  • 注意點(diǎn):存儲的值可能是數(shù)組/對象,不能直接存儲,需要轉(zhuǎn)換 JSON.stringify,
  • 這個(gè)時(shí)間如何設(shè)置呢?在這個(gè)值存入的時(shí)候在鍵(key)的基礎(chǔ)上擴(kuò)展一個(gè)字段,如:key+'expires',而它的值為當(dāng)前 時(shí)間戳 + expired過期時(shí)間

具體來看一下代碼 :

set(key, value, expired) {
 /*
 * set 存儲方法
 * @ param {String} key 鍵
 * @ param {String} value 值,
 * @ param {String} expired 過期時(shí)間,以分鐘為單位,非必須
 * @ 由@IT·平頭哥聯(lián)盟-首席填坑官∙蘇南 分享
 */
 let source = this.source;
 source[key] = JSON.stringify(value);
 if (expired){
 source[`${key}__expires__`] = Date.now() + 1000*60*expired
 };
 return value;
}

重寫 get(獲取) 方法:

  • 獲取數(shù)據(jù)時(shí),先判斷之前存儲的時(shí)間有效期,與當(dāng)前的時(shí)間進(jìn)行對比;
  • 但存儲時(shí)expired為非必須參數(shù),所以默認(rèn)為當(dāng)前時(shí)間+1,即長期有效;
  • 如果存儲時(shí)有設(shè)置過期時(shí)間,且在獲取的時(shí)候發(fā)現(xiàn)已經(jīng)小于當(dāng)前時(shí)間戳,則執(zhí)行刪除操作,并返回空值;
  • 注意點(diǎn):存儲的值可能是數(shù)組/對象,取出后不能直接返回,需要轉(zhuǎn)換 JSON.parse,

具體來看一下代碼 :

get(key) {
 /*
 * get 獲取方法
 * @ param {String} key 鍵
 * @ param {String} expired 存儲時(shí)為非必須字段,所以有可能取不到,默認(rèn)為 Date.now+1
 * @ 由@IT·平頭哥聯(lián)盟-首席填坑官∙蘇南 分享
 */
 const source = this.source,
 expired = source[`${key}__expires__`]||Date.now+1;
 const now = Date.now();

 if ( now >= expired ) {
 this.remove(key);
 return;
 }
 const value = source[key] ? JSON.parse(source[key]) : source[key];
 return value;
}

重寫 remove(刪除) 方法:

刪除操作就簡單了,;

remove(key) {
 const data = this.source,
 value = data[key];
 delete data[key];
 delete data[`${key}__expires__`];
 return value;
}

優(yōu)化點(diǎn):

  • 記得上次有個(gè)同學(xué),是這么評論的:「 刪除緩存能放到constructor里面執(zhí)行么,放到get里面 不取就一直在那是不是不太好?」;
  • 為什么不用for in而是 for ? for in循環(huán)遍歷對象的屬性時(shí),原型鏈上的所有屬性都將被訪問,解決方案:使用hasOwnProperty方法過濾或Object.keys會(huì)返回自身可枚舉屬性組成的數(shù)組;
class storage {

 constructor(props) {
 this.props = props || {}
 this.source = this.props.source || window.localStorage
 this.initRun();
 }
 initRun(){
 /*
 * set 存儲方法
 * @ param {String} key 鍵
 * @ param {String} value 值,存儲的值可能是數(shù)組/對象,不能直接存儲,需要轉(zhuǎn)換 JSON.stringify
 * @ param {String} expired 過期時(shí)間,以分鐘為單位
 * @ 由@IT·平頭哥聯(lián)盟-首席填坑官∙蘇南 分享
 */
 const reg = new RegExp("__expires__");
 let data = this.source;
 let list = Object.keys(data);
 if(list.length > 0){
 list.map((key,v)=>{
 if( !reg.test(key )){
  let now = Date.now();
  let expires = data[`${key}__expires__`]||Date.now+1;
  if (now >= expires ) {
  this.remove(key);
  };
 };
 return key;
 });
 };
 }
}

總結(jié):

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • var與Javascript變量隱式聲明

    var與Javascript變量隱式聲明

    在JavaScript中,var用來聲明變量,但是這個(gè)語法并不嚴(yán)格要求,很多時(shí)修改,我們可以直接使用一個(gè)變量而不用var聲明它。
    2009-09-09
  • Bootstrap源碼解讀網(wǎng)格系統(tǒng)(3)

    Bootstrap源碼解讀網(wǎng)格系統(tǒng)(3)

    這篇文章主要源碼解讀了Bootstrap網(wǎng)格系統(tǒng),介紹了Bootstrap網(wǎng)格系統(tǒng)的工作原理具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • el-select加上搜索查詢時(shí)限制開頭空格輸入的解決方案

    el-select加上搜索查詢時(shí)限制開頭空格輸入的解決方案

    這篇文章主要介紹了el-select加上搜索查詢時(shí),限制開頭空格輸入的解決方案,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • 微信小程序使用toast消息對話框提示用戶忘記輸入用戶名或密碼功能【附源碼下載】

    微信小程序使用toast消息對話框提示用戶忘記輸入用戶名或密碼功能【附源碼下載】

    這篇文章主要介紹了微信小程序使用toast消息對話框提示用戶忘記輸入用戶名或密碼功能,結(jié)合實(shí)例形式詳細(xì)分析了toast組件實(shí)現(xiàn)消息提示功能的相關(guān)操作技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下
    2017-12-12
  • 移動(dòng)端滑動(dòng)插件Swipe教程

    移動(dòng)端滑動(dòng)插件Swipe教程

    swipe.JS是一個(gè)比較有名的觸摸滑動(dòng)插件,它能夠處理內(nèi)容滑動(dòng),支持自定義選項(xiàng),你可以讓它自動(dòng)滾動(dòng),控制滾動(dòng)間隔,返回回調(diào)函數(shù)等。經(jīng)??梢娛褂迷谝苿?dòng)前端開發(fā)中。
    2016-10-10
  • JS實(shí)現(xiàn)點(diǎn)擊掉落特效

    JS實(shí)現(xiàn)點(diǎn)擊掉落特效

    這篇文章主要介紹了JS實(shí)現(xiàn)點(diǎn)擊掉落特效,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • javascript解決innerText瀏覽器兼容問題思路代碼

    javascript解決innerText瀏覽器兼容問題思路代碼

    innerText瀏覽器兼容這塊始終都是一個(gè)問題,下面與大家分享下使用javascript解決,感興趣的朋友可以參考下哈,希望對你有所幫助
    2013-05-05
  • js實(shí)現(xiàn)帶圓角的多級下拉菜單效果

    js實(shí)現(xiàn)帶圓角的多級下拉菜單效果

    這篇文章主要介紹了js實(shí)現(xiàn)帶圓角的多級下拉菜單效果,通過調(diào)用封裝的js庫ocscript.js實(shí)現(xiàn)圓角下拉菜單功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • js中變量的連續(xù)賦值(實(shí)例講解)

    js中變量的連續(xù)賦值(實(shí)例講解)

    下面小編就為大家?guī)硪黄猨s中變量的連續(xù)賦值(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • JavaScript保存并運(yùn)算頁面中數(shù)字類型變量的寫法

    JavaScript保存并運(yùn)算頁面中數(shù)字類型變量的寫法

    這篇文章主要介紹了JavaScript保存并運(yùn)算頁面中數(shù)字類型變量的寫法,當(dāng)你在頁面中需要不停運(yùn)算一個(gè)數(shù)字變量時(shí)非常有用,普通的寫法不能正常運(yùn)算,使用本文方法就可以,需要的朋友可以參考下
    2015-07-07

最新評論

望都县| 沁水县| 黎川县| 新巴尔虎左旗| 荥阳市| 辛集市| 忻城县| 高阳县| 梅河口市| 鹤峰县| 怀化市| 邵阳市| 江城| 怀柔区| 明光市| 卫辉市| 平阳县| 沈丘县| 昌图县| 故城县| 廊坊市| 灵丘县| 陇西县| 吴旗县| 施秉县| 淮北市| 澎湖县| 娄底市| 汽车| 吐鲁番市| 九龙县| 洞头县| 工布江达县| 临汾市| 崇左市| 万荣县| 汕头市| 湾仔区| 沅江市| 大厂| 鹰潭市|