共计 3180 个字符,预计需要花费 8 分钟才能阅读完成。
webStorage
基本概念
webStorage 提供了两种存储形式,localStorage 和 sessionStorage。
- localStorage 是长久化存储,不被动删除存储的内容会永恒存在
- sessionStorage 为会话级存储,敞开浏览器则销毁
具体的区别在于
- 敞开网页后从新关上,localStorage 会保留,sessionStorage 不会被保留
- 在页面内实现跳转,localStorage 会保留,sessionStorage 也会保留
- 在页面外实现跳转(关上新网页),localStorage 会保留,sessionStorage 不会被保留
属性和办法
localStorage 和 sessionStorage 都具备以下属性和办法
- 设置值 setItem(key, value)
- 通过索引获取值 key(index)
- 通过 key 获取值 getItem(key)
- 移除掉某个 key removeItem(key)
- 清空 clear()
- length 存储数据的长度
localStorage.setItem('name', 'alice')
localStorage.setItem('age', 20)
通过开发者工具中的 Application 中 Storage 能够查看到存储的内容
因为 locaStorage 和 sessionStorage 是 window 上的属性,所以在 Console 管制台上也能够间接操作
工具封装
localStorage 和 sessionStorage 只能存储字符串,当遇到对象时,会间接把它转成“[Object Object]”这样的字符串,这样当前读取也只能读到“[Object Object]”,数据就会失落
const lesson = {subject: "Math",};
localStorage.setItem("lessonObj", lesson);
localStorage.setItem("lessonStr", JSON.stringify(lesson));
所以咱们在存储对象时,须要先将对象转成字符串
每一次存储数据都要 stringify 将数据序列化,读取数据都须要 parse 解析成对象,能够将反复的代码进行封装,成为工具函数
class iceStore {constructor(flag) {this.storage = flag ? localStorage : sessionStorage;}
setItem(key, value) {const str = JSON.stringify(value);
this.storage.setItem(key, str);
}
getItem(key) {let value = this.storage.getItem(key);
if (value) {return JSON.parse(value);
}
}
key(index) {return this.storage.key(index);
}
removeItem(key) {return this.storage.removeItem(key);
}
clear() {return this.storage.clear();
}
length() {return this.storage.length;}
}
const localCache = new iceStore(true);
const sessionCache = new iceStore(false);
export {localCache, sessionCache};
在须要应用 localStorage/sessionStorage 的中央引入即可~
indexedDB
indexedDB 是用于客户端的数据库,应用键值对来保留大量的数据,有些像 NoSQL。
通过以下代码先开启对于 indexedDB 的连贯
// 关上名为 iceDB 的数据库,没有则新建一个
const dbRequest = indexedDB.open("iceDB")
// 第一次关上 / 版本更新时调用函数
dbRequest.onupgradeneeded = function(event){
// 获取操作数据库的 db 对象
const db = event.target.result
// 创立一些存储对象, 像表构造, keyPath 会作为表的主键,用于辨别唯一性,
// 存到 users 中的每一条数据须要有 id 属性
db.createObjectStore("users", { keyPath: 'id'})
}
let db = null
dbRequest.onsuccess = function(event){
// 拿到 db 对象,保留在全局,操作数据库用
db = event.target.result
}
此时曾经创立了名为 iceDB 的数据库,其中有一张表,名为 user
// transaction 中的第一个参数能够是数组,readwrite 能够读和写
const transaction = db.transaction("users", "readwrite")
// objectStore 办法从下面的事务中拿到 store 对象
const store = transaction.objectStore("users")
// 减少
const request = store.add({id: 1, name: 'kiki', 18})
// 一次操作实现的回调
request.onsuccess = function(){}
// 一次操作失败的回调
request.onerror = function(){}
// 事务全副实现,传入实现的回调
transaction.oncomplete = function(){}
// 查问,开启游标
const request = store.openCursor()
request.onsuccess = function(event){
// event 中蕴含游标,游标没有值的时候代表指到了最初
const cursor = event.target.result
if(cursor){
// 在某个条件进行查问
if(...){ }else{
// 游标持续查找
cursor.continue()}
}
}
// 批改
// 先查问到指定的数据,通过游标间接扭转数据
const value = cursor.value;
value.name = "lucy";
cursor.update(value)
// 删除
// 先查问到指定的数据,调用游标的删除办法
cursor.delete()
最终存储的成果
cookie
cookie 尽管也是浏览器的存储计划,但个别由服务端通过 http 申请头 Set-Cookie 字段设置,浏览器端每次发送申请的时候都会携带
cookie 的分类
- 内存 Cookie 由浏览器保护,保留在内存中,浏览器敞开时 Cookie 就会销毁
- 硬盘 Cookie 保留在硬盘中,有一个过期工夫,用户手动清理或者过期工夫到时,才会被清理
cookie 设置过期工夫
- expires:设置的是 Date.toUTCString()
- max-age:设置过期的秒钟,例如一年为 60 60 24 * 365
cookie 其它属性
- domain 不指定,那么默认是 origin,不包含子域名,指定后包含子域名
- path 指定主机下哪些门路能够承受 cookie
图示如下
浏览器端设置 cookie
通过 document.cookie 来设置,如果服务器端设置了 httpOnly,则浏览器端不能够更改服务器设置的 cookie
具体的 cookie 设置形式能够参考这一篇服务器的文章
如何通过 cookie、session 鉴权(nodejs/koa)
以上就是浏览器存储相干内容,对于 js 高级,还有很多须要开发者把握的中央,能够看看我写的其余博文,继续更新中~