l 内容目录json
简介数组
最后session
文中代码建议在Chrome/360Chrome下执行。工具
HTML5中新增长了localStorage和sessionStorage,二者都是window的对象,能够经过window.localStorage/window.sessionStorage访问,用于保存数据,只是保存的范围略有不一样。spa
下文中的Storage表示window.localStorage和window.sessionStorage。prototype
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 最后
第一次写这样的博客,经验不足。若是有错误的地方请及时指正。十分感谢。
第一次写博客居然紧张的把重点忘了,十分抱歉。