Javascript本地存储的⽅式有哪些?区别及应⽤场景?

简介: Javascript本地存储的⽅式有哪些?区别及应⽤场景?

前言


javaScript 本地存储(也称本地缓存)的⽅法我们主要讲述以下四种:


  • cookie
  • sessionStorage
  • localStorage
  • indexedDB

一、cookie


Cookie ,类型为「⼩型⽂本⽂件」,指某些⽹站为了辨别⽤户身份⽽储存在⽤户本地终端上的数据。 是为了解决 HTTP ⽆状态导致的问题。


作为⼀段⼀般不超过 4KB 的⼩型⽂本数据,它由⼀个名称(Name)、⼀个值(Value)和其它⼏个⽤于控制 cookie 有效期、安全性、使⽤范围的可选属性组成。


但是 cookie 在每次请求中都会被发送,如果不使⽤ HTTPS 并对其加密,其保存的信息很容易被窃取,导致安全⻛险。举个例⼦,在⼀些使⽤ cookie 保持登录态的⽹站上,如果 cookie 被窃取,他⼈很容

易利⽤你的 cookie 来假扮成你登录⽹站。


关于 cookie 常⽤的属性:


  • Expires ⽤于设置 Cookie 的过期时间
Expires=Wed, 21 Oct 2015 07:28:00 GMT
  • Max-Age ⽤于设置在 Cookie 失效之前需要经过的秒数(优先级⽐ Expires ⾼)
Max-Age=604800
  • Domain 指定了 Cookie 可以送达的主机名
    Path 指定了⼀个 URL 路径,这个路径必须出现在要请求的资源的路径中才可以发送 Cookie ⾸部
Path=/docs # /docs/Web/ 下的资源会带 Cookie ⾸部
  • 标记为 SecureCookie 只应通过被 HTTPS 协议加密过的请求发送给服务端

通过上述,我们可以看到 cookie ⼜开始的作⽤并不是为了缓存⽽设计出来,只是借⽤了 cookie 的特性实现缓存。


关于 cookie 的使用:

document.cookie = '名字=值';

关于 cookie 的修改,⾸先要确定 domain 和 path 属性都是相同的才可以,其中有⼀个不同得时候都会创建出⼀个新的 cookie。

Set-Cookie:name=aa; domain=aa.net; path=/ # 服务端设置
document.cookie =name=bb; domain=aa.net; path=/ # 客户端设置

最后 cookie 的删除,最常⽤的⽅法就是给 cookie 设置⼀个过期的事件,这样 cookie 过期后会被浏览器删除。


二、localStorage


HTML5 新⽅法,IE8及以上浏览器都兼容


特点:


⽣命周期:持久化的本地存储,除⾮主动删除数据,否则数据是永远不会过期的

存储的信息在同⼀域中是共享的

当本⻚操作(新增、修改、删除)了 localStorage 的时候,本⻚⾯不会触发 storage 事件,但是别的⻚⾯会触发 storage 事件。

⼤⼩:5M(跟浏览器⼚商有关系)

localStorage 本质上是对字符串的读取,如果存储内容多的话会消耗内存空间,会导致⻚⾯变卡受同源策略的限制。


关于localStorage 的使用


  • 设置
localStorage.setItem('username','cfangxu');
  • 获取
localStorage.getItem('username');
  • 获取键名
localStorage.key(0) //获取第⼀个键名;
  • 删除
localStorage.removeItem('username');
  • ⼀次性清除所有存储
localStorage.clear();


localStorage 也不是完美的,它有两个缺点:


  • ⽆法像 Cookie ⼀样设置过期时间
  • 只能存⼊字符串,⽆法直接存对象


localStorage.setItem('key', {name: 'value'});
console.log(localStorage.getItem('key')); // '[object, Object]'


三、sessionStorage


sessionStorage 和 localStorage 使⽤⽅法基本⼀致,唯⼀不同的是⽣命周期,⼀旦⻚⾯(会话)关闭, sessionStorage 将会删除数据。


四、扩展的前端存储⽅式


indexedDB 是⼀种低级API,⽤于客户端存储⼤量结构化数据(包括, ⽂件/ blobs)。该API使⽤索引来实现对该数据的⾼性能搜索


虽然 Web Storage 对于存储较少量的数据很有⽤,但对于存储更⼤量的结构化数据来说,这种⽅法不太有⽤。IndexedDB 提供了⼀个解决⽅案


优点:


  • 储存量理论上没有上限
  • 所有操作都是异步的,相⽐ LocalStorage 同步操作性能更⾼,尤其是数据量较⼤时
  • 原⽣⽀持储存 JS 的对象
  • 是个正经的数据库,意味着数据库能⼲的事它都能⼲


缺点:


  • 操作⾮常繁琐
  • 本身有⼀定⻔槛


关于 indexedDB 的使⽤基本使⽤步骤如下:


  • 打开数据库并且开始⼀个事务
  • 创建⼀个 object store
  • 构建⼀个请求来执⾏⼀些数据库操作,像增加或提取数据等。
  • 通过监听正确类型的 DOM 事件以等待操作完成。
  • 在操作结果上进⾏⼀些操作(可以在 request 对象中找到)


关于使⽤ indexdb 的使⽤会⽐较繁琐,⼤家可以通过使⽤ Godb.js 库进⾏缓存,最⼤化的降低操作难度。


五、总结


一、区别


关于 cookie 、 sessionStorage 、 localStorage 三者的区别主要如下:


存储⼤⼩:

cookie 数据⼤⼩不能超过 4k , sessionStorage 和localStorage 虽然也有存储⼤⼩的限制,但⽐ cookie ⼤得多,可以达到5M或更⼤


有效时间:

localStorage 存储持久数据,浏览器关闭后数据不丢失除⾮主动删除数据;sessionStorage 数据在当前浏览器窗⼝关闭后⾃动删除; cookie 设置的 cookie 过期时间之前⼀直有效,即使窗⼝或浏览器关闭


数据与服务器之间的交互⽅式, cookie 的数据会⾃动的传递到服务器,服务器端也可以写cookie 到客户端; sessionStorage 和 localStorage 不会⾃动把数据发给服务器,仅在本地保存


二、应⽤场景


在了解了上述的前端的缓存⽅式后,我们可以看看针对不对场景的使⽤选择:


  • 标记⽤户与跟踪⽤户⾏为的情况,推荐使⽤ cookie
  • 适合⻓期保存在本地的数据(令牌),推荐使⽤ localStorage
  • 敏感账号⼀次性登录,推荐使⽤ sessionStorage
  • 存储⼤量数据的情况、在线⽂档(富⽂本编辑器)保存编辑历史的情况,推荐使⽤ indexedDB

目录
相关文章
|
21天前
纸屑飘落生日蛋糕场景js+css3动画特效
纸屑飘落生日蛋糕CSS3动画特效是一款js+css3制作的全屏纸屑飘落,生日蛋糕点亮庆祝动画特效。
40 3
|
1月前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
29 1
|
1月前
|
设计模式 JavaScript 前端开发
js中new和object.creat区别
【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。
|
2月前
|
前端开发 JavaScript UED
JavaScript 中的函数防抖与节流详解及实用场景
在前端开发中,处理用户频繁触发的事件,如输入框的输入、按钮点击、窗口调整大小等,常常需要优化性能以减少无效操作。为此,函数防抖(debounce)和函数节流(throttle)是两种常见的性能优化手段。本文将详细介绍两者的区别与实现,并探讨它们的应用场景。
52 1
|
2月前
|
存储 JavaScript 前端开发
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
JavaScript 数据类型分为基本数据类型和引用数据类型。基本数据类型(如 string、number 等)具有不可变性,按值访问,存储在栈内存中。引用数据类型(如 Object、Array 等)存储在堆内存中,按引用访问,值是可变的。本文深入探讨了这两种数据类型的特性、存储方式、以及检测数据类型的两种常用方法——typeof 和 instanceof,帮助开发者更好地理解 JavaScript 内存模型和类型检测机制。
118 0
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
|
2月前
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
23 2
|
1月前
|
分布式计算 JavaScript 前端开发
在 JavaScript 中,哪些场景需要考虑精度控制?
【10月更文挑战第29天】JavaScript在上述各种场景中都需要根据具体的业务需求和数据特点,合理地进行精度控制,以确保计算结果的准确性和可靠性,从而为用户提供正确、稳定的服务和体验。
|
2月前
|
JavaScript 前端开发
【JavaScript】let,const和var的区别
总的来说,随着ECMAScript 6(ES6)及后续版本的推广,`let`和 `const`因其增强的块级作用域和对变量行为的更严格控制,逐渐成为现代JavaScript编码实践中推荐使用的变量声明方式。而 `var`由于其历史遗留的局限性,正逐渐被边缘化,但在维护老代码或处理特定兼容性需求时仍需了解。
47 3
|
3月前
|
JavaScript 前端开发
JavaScript中单引号和双引号的效果的一点区别
JavaScript中单引号和双引号的效果的一点区别
|
2月前
|
存储 JSON JavaScript
Vue.js开发中基于localStorage与sessionStorage的本地存储利器:Vue-ls插件使用详解
Vue.js开发中基于localStorage与sessionStorage的本地存储利器:Vue-ls插件使用详解
103 0