一、什么是 localStorage、sessionStorage
在HTML5中,新加入了localStorage特性,这个特性主要是用作本地存储,解决了cookie存储空间不足的问题(cookie中每条cookie存储空间为 4k),localStorage中一般浏览器支持的是5M大小,这个在不同的浏览器中localStorage会有所不同。
二、localStorage 的优势与局限
localStorage优势
localStorage局限
针对不同浏览器,localstorage大小不统一,并且在IE8以上的 IE 版本才支持localStorage属性;
目前所有的浏览器都会把localStorage的值类型限定为string类型,对于比较常见的JSON对象类型需要一些转换;
localStorage在浏览器隐私模式下面是不可读取的;
localStorage本质上是对字符串的读取,如果存储内容多的话会消耗内存空间,会导致页面变卡;
localStorage不能被爬虫抓取到;
localStorage与sessionStorage的唯一一点区别就是localStorage为永久性存储,而sessionStorage当会话结束的时候,sessionStorage中的键值对会被清空。
三、localStorage 应用
localStorage在浏览器中的支持情况如下:
这里要特别声明一下,如果是使用 IE 浏览器的话,那么就要UserData来作为存储,这里主要讲解的是localStorage内容,所以userData不做过多的解释,因为目前的IE6/IE7属于淘汰的位置上,而且在如今的很多页面开发都会涉及到HTML5\CSS3等新兴技术,所以在使用上面一般我们不会去对其进行兼容。
首先,在使用localStorage的时候,需要判断浏览器是否支持localStorage属性。
if(!window.localStorage){ alert("浏览器不支持localstorage"); return false; }else{ //主逻辑业务 }
复制代码
localStorage写入,localStorage写入有三种方法,下面一一介绍下:
if (!window.localStorage) { alert("浏览器不支持localstorage"); return false; } else { var storage = window.localStorage; //写入a字段 storage["a"]=1; //写入b字段 storage.a=1; //写入c字段 storage.setItem("c",3); console.log(typeof storage["a"]); console.log(typeof storage["b"]); console.log(typeof storage["c"]); }
复制代码
运行后结果如下:
这里要特别说明一下localStorage的使用也是遵循同源策略的,所以不同网站不能共用相同的localStorage。
最后在控制台上面打印出来的结果是:
不知道有没有童鞋注意到,刚刚存储进去的是int类型,但打印出来却是string类型,这个与localStorage本身特点有关,localStorage只支持string类型的存储。
localStorage读取
if (!window.localStorage) { alert("浏览器不支持localstorage"); } else { var storage = window.localStorage; //写入a字段 storage["a"] = 1; //写入b字段 storage.a = 1; //写入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); }
复制代码
上面演示了对localStorage的三种存储/读取方式,官方推荐getItem\setItem这方法对其进行存取。
前面说过localStorage相当于前端数据库,数据库主要是CRUD,这里的读取和写入就相当于增、查两个步骤。
接下来谈下localStorage的删、改操作:
改这个步骤比较好理解,思路跟重新更改全局变量一样:
if (!window.localStorage) { alert("浏览器不支持localstorage");} else { var storage = window.localStorage; //写入a字段 storage["a"] = 1; //写入b字段 storage.b = 1; //写入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);}
复制代码
在控制台可看到 a 键已经被更改为 4。
localStorage的删除
1、将localStorage所有内容清除
var storage = window.localStorage;storage.a = 1;storage.setItem("c",3);console.log(storage);storage.clear();console.log(storage);
复制代码
2、 将localStorage中某个键值对删除
var storage = window.localStorage;storage.a = 1;storage.setItem("c",3);console.log(storage);storage.removeItem("a");console.log(storage.a);
复制代码
控制台查看结果
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()方法,向其中输入索引即可获取对应的键值。
四、localStorage 注意事项
一般我们会将JSON存入localStorage中,但是在localStorage会自动将localStorage转换成为字符串形式。
这个时候可以使用JSON.stringify(),将JSON对象转换成为JSON字符串。
示例:
if (!window.localStorage) { alert("浏览器不支持localstorage");} else { var storage = window.localStorage; var data = { name:'SHQ5785', sex:'man', hobby:'program' }; var d = JSON.stringify(data); storage.setItem("data",d); console.log(storage.data);}
复制代码
读取之后,使用JSON.parse()方法将JSON字符串转换成为JSON对象:
var storage = window.localStorage;var data = { name:'SHQ5785', sex:'man', hobby:'program'};var d = JSON.stringify(data);storage.setItem("data",d);//将JSON字符串转换成为JSON对象输出var json = storage.getItem('data');var jsonObj = JSON.parse(json);console.log(typeof jsonObj);
复制代码
打印出来是Object对象。
需要注意的是,JS数组本质上也是对象类型,所以上面的代码对数组也是适用的。
var arra = [1,2,3,4];localStorage.setItem('key',JSON.stringify(arra));var read=JSON.parse(localStorage.getItem('key'));console.log(read,read.length);
复制代码
溢出处理
try { localStorage.setItem(key,value);} catch(oException) { if (oException.name == 'QuotaExceededError') { console.log('已经超出本地存储限定大小!'); // 可进行超出限定大小之后的操作,如下面可以先清除记录,再次保存 localStorage.clear(); localStorage.setItem(key,value); }}
复制代码
评论