[0]-JavaScript中的localStorage和sessionStorage
l 内容目录
最后
文中代码建议在Chrome/360Chrome下执行。
HTML5中新增加了localStorage和sessionStorage,两者都是window的对象,可以通过window.localStorage/window.sessionStorage访问,用于保存数据,只是保存的范围略有不同。
下文中的Storage表示window.localStorage和window.sessionStorage。
1) 两者异同
都以键值对的形式存储数据,数据的键和值都是String类型
localStorage存储在本地,除非手动清除否则数据不会过期消失
sessionStorage伴随session存在,窗口关闭后存储在sessionStorage的数据将消失
2) 继承关系
localStorage和sessionStorage都是Storage的实例
通过console.dir(localStorage)列出localStorage中存储的数据,我们发现了一个叫做__proto__的属性
对象的__proto__会指向生成该对象构造函数的prototype属性。
我们通过查找localStorage.__proto__也知道了localStorage是Storage的实例。
实际上JavaScript的instanceof运算符就是通过这种形式判断一个对象是否是一个类的实例。
3) 使用
我们可以看到Storage中定义的方法:
clear() 清除存储的所有数据
getItem(String key) 获取key对应的value,返回的value为String类型
key(Number|String index) 获取指定索引数据的Key,如果index无法被转换成数字将返回key(0)的返回值,如果index指定的索引没有存储任何数据将返回null,不传递参数将会抛出Error
removeItem(String key) 移除key指定的键值对
setItem(String key, String value) 设置键和值,参数都会被转换为字符串
在实际开发中我们难免要使用Storages存储String以外的内容,比如存储Object、Array等。
那么就来尝试一下存取Object,在Chrome开发者工具下执行代码后查看Resources选项卡:
我们发现"person"对应的值是"[object Object]",让我们再将person取出
返回的竟然是"[object Object]"的字符串,这是为什么呢?不急,我们再按照刚才的步骤存取一个Array
我们发现打印刚刚存储的numbers通过typeof运算符查看其类型是String
相信前面仔细看的同行们已经知道了:因为存储在Storage中的数据都会被转换成字符串,对于Object和Array这类对象,在存储时会调用其toString()方法(这一点与Java中的System.out.println()传入对象时会默认调用toString()方法是一样的)。
如此一来我们对象实际存储的属性无法获取,但是在实际开发中如此利器(可读可写,数据永不丢失,最大5MB,已提供的读写接口)只保存字符串又有点可惜,那能否有一种方法可以让Storage存储对象或数组呢?你知道JSON吗?我们可以通过window.JSON对象将对象序列化成JSON串,也可以将一个合法的JSON串反序列化成一个对象,按照以下方式存储则不会丢失存放在Storage中的对象/数组
我们在 localStorage.setItem(key, value) 时把需要存储对象通过 JSON.stringify(obj) 方法序列化成JSON串,在 localStorage.getItem(key) 后使用 JSON.parse(json) 将存储的JSON串反序列化就可以得到我们存储的对象了。
localStorage适合作为缓存存储不会被经常修改的数据,如组织机构树,被缓存的数据可以通过Chrome的开发者工具的Resources选项卡查看(如图我们可以看到还可以查看Web SQL和Cookie等等,世界真是太美好了)
sessionStorage存储临时数据,会随着窗口被关闭而消失
Storages和Cookie的区别:
1) Storages中存储的数据不会随着请求被提交到服务器
2) Cookie最大为4KB,而Storages目前的形势可以按照5MB考虑
3) 对于Cookie我们使用原生JavaScript没有比较友好的读写方式,而对于Storages,我们可以使用Storage定义的方法轻松的进行读写
l 最后
第一次写这样的博客,经验不足。如果有错误的地方请及时指正。十分感谢。
第一次写博客竟然紧张的把重点忘了,十分抱歉。