sessionStorage 、localStorage 和 cookie 之間的區(qū)別

一、sessionStorage 、localStorage 和 cookie 之間的區(qū)別

-共同點(diǎn):
都是保存在瀏覽器端,且同源的。
-區(qū)別:
1.cookie數(shù)據(jù)始終在同源的http請(qǐng)求中攜帶(即使不需要),即cookie在瀏覽器和服務(wù)器間來回傳遞。而sessionStorage和localStorage不會(huì)
自動(dòng)把數(shù)據(jù)發(fā)給服務(wù)器,僅在本地保存。cookie數(shù)據(jù)還有路徑(path)的概念,可以限制cookie只屬于某個(gè)路徑下。
2.存儲(chǔ)大小限制也不同,cookie數(shù)據(jù)不能超過4k,同時(shí)因?yàn)槊看蝖ttp請(qǐng)求都會(huì)攜帶cookie,所以cookie只適合保存很小的數(shù)據(jù),如會(huì)話標(biāo)
識(shí)。sessionStorage和localStorage 雖然也有存儲(chǔ)大小的限制,但比cookie大得多,可以達(dá)到5M或更大。
3.數(shù)據(jù)有效期不同,sessionStorage:僅在當(dāng)前瀏覽器窗口關(guān)閉前有效,自然也就不可能持久保持;localStorage:始終有效,窗口或?yàn)g
覽器關(guān)閉也一直保存,因此用作持久數(shù)據(jù);cookie只在設(shè)置的cookie過期時(shí)間之前一直有效,即使窗口或?yàn)g覽器關(guān)閉。
4.作用域不同,sessionStorage不在不同的瀏覽器窗口中共享,即使是同一個(gè)頁(yè)面;localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。
5.Web Storage 支持事件通知機(jī)制,可以將數(shù)據(jù)更新的通知發(fā)送給監(jiān)聽者。
6.Web Storage 的 api 接口使用更方便

注意:
1.同源"指的是"三個(gè)相同"。
-協(xié)議相同
-域名相同
-端口相同
舉例來說:
http://www.example.com/dir/page.html這個(gè)網(wǎng)址,協(xié)議是http://,域名是www.example.com,端口是80(默認(rèn)端口可以省略)。
它的同源情況如下。
http://www.example.com/dir2/other.html:同源
http://example.com/dir/other.html:不同源(域名不同)
http://v2.www.example.com/dir/other.html:不同源(域名不同)
http://www.example.com:81/dir/other.html:不同源(端口不同)
2.目前所有的瀏覽器中都會(huì)把localStorage的值類型限定為string類型,這個(gè)在對(duì)我們?nèi)粘1容^常見的JSON對(duì)象類型需要一些轉(zhuǎn)換

二、sessionStorage與頁(yè)面 js 數(shù)據(jù)對(duì)象的區(qū)別

頁(yè)面中一般的 js 對(duì)象或數(shù)據(jù)的生存期是僅在當(dāng)前頁(yè)面有效,因此刷新頁(yè)面或轉(zhuǎn)到另一頁(yè)面這樣的重新加載頁(yè)面的情況,數(shù)據(jù)就不存在了。
而sessionStorage 只要同源的同窗口(或tab)中,刷新頁(yè)面或進(jìn)入同源的不同頁(yè)面,數(shù)據(jù)始終存在。也就是說只要這個(gè)瀏覽器窗口沒
有關(guān)閉,加載新頁(yè)面或重新加載,數(shù)據(jù)仍然存在。

三、localStorage的使用

首先在使用localStorage的時(shí)候,我們需要判斷瀏覽器是否支持localStorage這個(gè)屬性
if(!window.localStorage){
    alert("瀏覽器不支持localstorage");
    return false;
}else{
     //主邏輯業(yè)務(wù)
}

3.1 localStorage的寫入有三種方法,這里就一一介紹一下

if(!window.localStorage){
        alert("瀏覽器不支持localstorage");
        return false;
}else{
        var storage=window.localStorage;
        //寫入a字段
        storage["a"]=1;
        //寫入b字段
        storage.b=2;
        //寫入c字段
        storage.setItem("c",3);
        console.log(typeof storage["a"]);
        console.log(typeof storage["b"]);
        console.log(typeof storage["c"]);
}

運(yùn)行后的結(jié)果如下:

image.png
這里要特別說明一下localStorage的使用也是遵循同源策略的,所以不同的網(wǎng)站直接是不能共用相同的localStorage

最后在控制臺(tái)上面打印出來的結(jié)果是:

image.png
注意:剛剛存儲(chǔ)進(jìn)去的是int類型,但是打印出來卻是string類型,這個(gè)與localStorage本身的特點(diǎn)有關(guān),localStorage只支持string類型的存儲(chǔ)。

3.2 localStorage的讀取

if(!window.localStorage){
  alert("瀏覽器不支持localstorage");
}else{
  var storage=window.localStorage;
  //寫入a字段
  storage["a"]=1;
  //寫入b字段
  storage.b=2;
  //寫入c字段
  storage.setItem("c",3);
  console.log(typeof storage["a"]);
  console.log(typeof storage["b"]);
  console.log(typeof storage["c"]);
  //第一種方法讀取
  var a=storage.a;
  console.log(a);
  //第二種方法讀取
  var b=storage["b"];
  console.log(b);
  //第三種方法讀取
  var c=storage.getItem("c");
  console.log(c);
}

這里面是三種對(duì)localStorage的讀取,其中官方推薦的是getItem\setItem這兩種方法對(duì)其進(jìn)行存取

3.3 localStorage的修改


if(!window.localStorage){
  alert("瀏覽器不支持localstorage");
}else{
  var storage=window.localStorage;
  //寫入a字段
  storage["a"]=1;
  //寫入b字段
  storage.b=2;
  //寫入c字段
  storage.setItem("c",3);
  console.log(storage.a);
  // console.log(typeof storage["a"]);
  // console.log(typeof storage["b"]);
  // console.log(typeof storage["c"]);
  /*分割線*/
  storage.a=4;
  console.log(storage.a);
}
這個(gè)在控制臺(tái)上面我們就可以看到已經(jīng)a鍵已經(jīng)被更改為4了

3.4 localStorage的刪除
3.4.1 將localStorage的所有內(nèi)容清除

var storage=window.localStorage;
storage.a=1;
storage.setItem("c",3);
console.log(storage);
storage.clear();
console.log(storage);
image.png

3.4.2 將localStorage中的某個(gè)鍵值對(duì)刪除

var storage=window.localStorage;
storage.a=1;
storage.setItem("c",3);
console.log(storage);
storage.removeItem("a");
console.log(storage.a);

image.png

3.5 localStorage的鍵獲取

var storage=window.localStorage;
storage.a=1;
storage.setItem("c",3);
for(var i=0;i<storage.length;i++){
var key=storage.key(i);
console.log(key);
}
使用key()方法,向其中出入索引即可獲取對(duì)應(yīng)的鍵

image.png

四、localStorage其他注意事項(xiàng)

一般我們會(huì)將JSON存入localStorage中,但是在localStorage會(huì)自動(dòng)將localStorage轉(zhuǎn)換成為字符串形式
這個(gè)時(shí)候我們可以使用JSON.stringify()這個(gè)方法,來將JSON轉(zhuǎn)換成為JSON字符串

示例:

if(!window.localStorage){
alert("瀏覽器不支持localstorage");
}else{
var storage=window.localStorage;
var data={
name:'xiecanyong',
sex:'man',
hobby:'program'
};
var d=JSON.stringify(data);
storage.setItem("data",d);
console.log(storage.data);
}

讀取之后要將JSON字符串轉(zhuǎn)換成為JSON對(duì)象,使用JSON.parse()方法
var storage=window.localStorage;
var data={
name:'xiecanyong',
sex:'man',
hobby:'program'
};
var d=JSON.stringify(data);
storage.setItem("data",d);
//將JSON字符串轉(zhuǎn)換成為JSON對(duì)象輸出
var json=storage.getItem("data");
var jsonObj=JSON.parse(json);
console.log(typeof jsonObj);

image.png

另外還有一點(diǎn)要注意的是,其他類型讀取出來也要進(jìn)行轉(zhuǎn)換

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容