三者的异同点:
(1)三者都是保存在浏览器端,且同源的。
(2)cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递。而sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。
(3)cookie数据还有路径(path)的概念,可以限制cookie只属于某个路径下。
(4)存储大小限制也不同。cookie数据不能超过4k,同时因为每次http请求都会携带cookie,所以cookie只适合保存很小的数据,如会话标识。sessionStorage和localStorage 对存储空间大小的限制是以每个来源(协议、域和端口)为单位的,大多数桌面浏览器会设置每个来源5MB的限制,手机版一般是2.5MB。
(5)数据有效期不同。sessionStorage仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持;localStorage始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie只在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭。
(6)作用域不同。sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面;localStorage 和cookie在所有同源窗口中都是共享的。
(7)Web Storage 支持事件通知机制,可以将数据更新的通知发送给监听者。Web Storage的api接口使用更方便。
(8)sessionStorage和localStorage都是Storage类型的一个实例,都可以使用Storage上的方法,有:getItem(name),setItem(name,value),removeItem(name),key(index),clear()。clear方法Firefox没有实现。
1. cookie
document.cookie是一个小型文本文件,大小约4KB
由键值对组成,由分号+空格进行分隔。
虽然cookie存储在浏览器端,但是大部分时候我们是在服务器端对其进行设置,我们可以在http返回体(Response Headers)里面通过设置Set-Cookie这个头部来告诉浏览器端要存储的cookie。
想要唯一标定一个cookie值,需要name、domain、path的组合 。// 在谷歌的控制台运行代码
document.cookie();
// 分别在163.com和music.163.com下运行得到:
// "usertrack=ZUcIhldBah6+iStRCF0AAg==; ...(省略); s_n_f_l_n3=ba0f0bb7ac7c39371473901661964"
// "usertrack=ZUcIhldBah6+iStRCF0AAg==; ...(省略); s_n_f_l_n3=ba0f0bb7ac7c39371473901661964; ...(省略)"
// 可以发现music.163.com下运行得到的cookie集合包含163.com下得到的。在路径都为根目录时,父域的cookie在子域有效
// 将'a=b'添加到cookie集合中,不会覆盖原来的。
document.cookie='a=b'
// 修改name为a的value值,改为c
document.cookie='a=c'
// 删除name为a的cookie,将max-age设置为0,可以删除cookie
document.cookie="a=''; max-age=0"
// cookie的读取、写入、删除操作封装(来自js高级程序设计),网易笔试题
var CookieUtil = {
// 方法根据cookie的name取value值
get: function(name){
var cookieName = encodeURIComponent(name) + '=',
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null;
if(cookieStart > -1){
var cookieEnd = document.cookie.indexOf(";", cookieStart);//用字符串的indexOf方法查询
if(cookieEnd == -1){//表明这个cookie是最后一对
cookieEnd = document.cookie.length;
}
//substring取不到cookieEnd
cookieValue = decodeURIComponent(document.cookie.substring(cookieStart+cookieName.length, cookieEnd));
}
return cookieValue;//只返回value值
},
set: function(name, value, expires, path, domain, secure){
var cookieText = encodeURIComponent(name) + '=' + encodeURIComponent(value);
// 判断expires是不是Date对象的实例
if(expires instanceof Date){
cookieText += "; expires=" + expires.toGMTString();
}
if(path){
cookieText += "; path=" + path;
}
if(domain){
cookieText += "; domain=" + domain;
}
if(secure){
cookieText += "; secure";
}
document.cookie = cookieText;//添加cookie,不会覆盖原来的
},
// 通过设置过期时间删除cookie
unset: function (name, path, domain, secure){
this.set(name, "", new Date(0), path, domain, secure);
}
}
2. 遍历web Storgge
// sessionStorage遍历
for(var i=0, len=sessionStorage.length; i<len; i++){
<span style="white-space:pre"> </span>var key = sessionStorage.key(i);
<span style="white-space:pre"> </span>var value = sessionStorage.getItem(key);
<span style="white-space:pre"> </span>alert(key + '=' + value);
}
// localStorage遍历
for(var i=0, len=localStorage.length; i<len; i++){
<span style="white-space:pre"> </span>var key = localStorage.key(i);
<span style="white-space:pre"> </span>var value = localStorage.getItem(key);
<span style="white-space:pre"> </span>alert(key + '=' + value);
}