客户端存储技术——sessionStorage和localStorage

794 阅读3分钟

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

Web Storage

一、认识Web Storage

  • Web Storage的目的是解决通过客户端存储不需要频繁发送回服务器的数据时使用的问题;
  • 提供在cookie之外的存储会话数据的途径、跨会话持久化存储大量数据的机制;
  • Web Storage定义了两个对象:localStoragesessionStoragelocalStroage是永久存储机制,sessionStorage是跨会话的存储机制。这两种浏览器存储API提供了在浏览中不受页面刷新影响而存储数据的两种方式;

二、Storage类型

Storage类型用于保存名/值对数据,直至存储空间上限(由浏览器决定)。Storage的实例与其它对象一样,但增加了一下的方法;

  • clear():删除所有值,不在Firefox实现
  • getItem(name):取得给定name的值
  • key(index):取得给定数值位置的名称
  • removeItem(name):删除给定name的名/值对
  • setItem(name, value):设置给定name的值

getItem()removeItem()setItem()方法可以直接或间接通过Storage对象调用。因为每个数据项都作为属性存储在该对象上,所以可以使用点或方括号操作符访问这些属性,注意不要重写了某个已存在的对象成员。通过同样的操作来设置值,也可以使用delete操作符删除属性。

  • Storage类型只能存储字符串。非字符串数据在存储之前会自动转换为字符串。这些转换不能在获取数据实际撤销。
  • 通过length属性可以确定Storage对象中保存了多少名/值对。

三、sessionStorage对象

  • sessionStorage对象只存储会话数据,数据只会存储到浏览器关闭。
  • 存储在sessionStorage中的数据不受页面刷新影响,可以在浏览器崩溃并重启后回复。
  • 与服务器会话紧密相关,因此在服务器才能使用,本地文件不行。
  • 对象中的数据只能由最初存储数据的页面使用,多页不行。

操作方法

  1. 通过setItem()方法或直接给属性赋值添加数据。

    sessionStorage.setItem('name', 'mannqo');
    sessionStorage.name = 'mannqo';
    
  2. 使用getItem()或直接访问属性名来获取数据

    let name = sessionStorage.getItem('name');
    let name = sessionStorage.name;
    
  3. 使用removeItem()方法或delete操作符删除对象属性

    delete sessionStorage.name;
    sessionStorage.removeItem('book');
    
  4. 遍历所有sessionStorage的名/值对

    for (let key in sessionStorage) {
        let value = sessionStorage.getItem(key);
        console.log(`${key}=${value}`)
    }
    

所有现代浏览器在实现存储写入时都使用了同步阻塞方式,因此数据会被立即提交到存储,通过Web Storage写入的任何数据都可以立即被读取。sessionStorage对象应该主要用于存储只在会话期间有效的小块数据。如果需要跨会话持久存储数据的话,可以使用localStorage

四、localStorage对象

要访问一个localStorage对象,页面必须来自同一个域(子域不可以)、在相同的端口上使用相同的协议。

  1. 使用方法或属性存储数据

    localStorage.setItem('name', 'mannqo');
    localStorage.name = 'mannqo';
    
  2. 使用方法或属性取得数据

    let name = localStorage.getItem('name');
    let name = localStorage.name;
    

五、localStoragesessionStorage的区别

存储在localStorage中的数据会保留到通过JavaScript删除或者用户清除浏览器缓存。localStorage数据不受页面刷新影响,也不会因关闭窗口、标签页或重新启动浏览器而丢失。