JSON

JSON(JavaScript Object Notation JS对象符号)是一种重要的数据格式

其他传输数据格式

XML

一种标记语言,但在解析传输等各方面都弱于JSON,因此如今很少用于传输数据

Protobuf

在许多语言中支持,直至2021年的3.x版本才支持JavaScript,所以目前使用较少

使用场景

  • 数据传输中作为数据格式
  • 配置文件
  • 非关系数据库中作为存储格式

基本语法

基础数据类型

  • Number数字
  • String字符串
  • Boolean布尔
  • null

对象类型

  1. {
  2. "key1":value1,
  3. "key2":value2,
  4. ···,
  5. "keyn":valuen
  6. }

数组类型

  1. [value1,vaue2,···,vuluen]

序列化

JSON.stringify()

  1. var obj={name:'rv',age:20}
  2. // 直接转化
  3. JSON.stringify(obj);
  4. // 选择转化
  5. JSON.stringify(obj,['name']);
  6. // 拦截转化
  7. JSON.stringify(obj,(key,value)=>{
  8. if(key==='age'){
  9. value-=10;
  10. }
  11. return value;
  12. })
  13. // 第三个参数:space开启缩进,美化JSON
  14. JSON.stringify(obj,null,2);
  15. JSON.stringify(obj,null,'\t');
  16. // toJSON方法
  17. /* 如果obj对象中存在toJSON方法,在序列化时则会调用toJSON方法一一转化每一条属性 */

JSON.parse()

  1. var str='{"name":"rv","age":20}'
  2. // 直接解析
  3. JSON.parse(str)
  4. // 拦截解析
  5. JSON.parse(str,(key,value)=>{
  6. if(key==='age'){
  7. value+=10;
  8. }
  9. return value;
  10. })

本地存储方案

WebStorage

WebStorage主要提供了一种机制,可以让浏览器提供一种比cookie更直观的键值对存储方式

  • localStorage

    • 本地存储,提供一种永久存储方式
  • sessionStorage

    • 会话存储,提供本次会话的存储

Storage常见方法和属性

  • 属性

    • length数据项数量
  • 方法

    • key(index)返回第index个key
    • getItem(key)返回数据项对应value
    • setItem(key,value)新增或更新数据项
    • removeItem(key)删除数据项
    • clear()清空存储

IndexedDB

IndexedDB是一种底层API,用于客户端存储大量的结构化数据

  • 它是一种事务型数据库系统,是一种基于JavaScript面向对象数据库(类似于非关系型数据库)

  • IndexedDB本身就是基于事务的,我们只需要指定数据库的模式,打开与数据库的连接,然后检索和更新一系列事务即可

1.打开数据库,与数据库建立连接

  1. /* 打开数据库
  2. 若没有则自动创建IndexedDB
  3. */
  4. const dbRequest=indexedDB.open('rv')
  5. /* 监听回调 */
  6. // 失败回调
  7. dbRequest.onerror(err=>{
  8. console.log('失败',err)
  9. })
  10. // 成功回调(常用于获取DB操作对象)
  11. let db=null
  12. dbRequest.onsuccess(event=>{
  13. db=event.target.result
  14. })
  15. // 首次打开或版本发生更新回调
  16. dbRequest.onupgradeneeded(event=>{
  17. // 获取数据库操作对象
  18. const db=event.target.result
  19. // 创建存储对象
  20. db.createObjectStore('user',{keyPath:'id'})
  21. })

2.设置操作模式,获取store对象

  1. /* 设置操作模式
  2. 参数一:设置存储对象操作模式,可字符串或数组
  3. 参数二:操作模式
  4. */
  5. const transaction=db.transaction(['user'],'readwrite')
  6. const store=transaction.objectStore('user')

3.新增操作

  1. let user={name:'rv',age:20}
  2. const request=store.add(user)
  3. /* 监听当前操作 */
  4. // 方式一
  5. transaction.oncomplete(()=>{
  6. console.log('本次事务完成')
  7. })
  8. // 方式二
  9. request.onsuccess(()=>{
  10. console.log('新增完成')
  11. })

4.查询操作

  1. // 查询方式一:通过keyPath主键查询
  2. const request1=store.get(100)
  3. request1.onsuccess(event=>{
  4. console.log(event.target.result)
  5. })
  6. // 查询方式二:游标查询
  7. const request2=store.openCursor()
  8. request2.onsuccess(event=>{
  9. const cursor=event.target.result
  10. if(cursor){
  11. console.log(cursor.key,cursor.value)
  12. // 继续游标遍历
  13. cursor.continue()
  14. }else{
  15. console.log('查询完成')
  16. }
  17. })

5.更新操作

更新操作依赖于游标查询操作

  1. const request=store.openCursor()
  2. request.onsuccess(event=>{
  3. const cursor=event.target.result
  4. if(cursor.key==='age'){
  5. let value=cursor.value
  6. value-=10
  7. // 更新操作
  8. cursor.update(value)
  9. }
  10. })

6.删除操作

删除操作依赖于游标查询操作

  1. const request=store.openCursor()
  2. request.onsuccess(event=>{
  3. const cursor=event.target.result
  4. if(cursor.key==='name'){
  5. // 删除操作
  6. cursor.delete()
  7. }
  8. })

Cookie

小型文本文件,某些网站为了辨别用户身份而存储在用户本地终端上的数据

内存cookie与硬盘cookie

Cookie总是存储在客户端中,按照存储位置可分为内存cookie和硬盘cookie

分辨内存cookie与硬盘cookie

没有设置过期时间时,默认情况下cookie为内存cookie

当设置了过期时间且时间不为0或负数时则为硬盘cookie

  • 内存cookie由浏览器维护,当浏览器关闭时会清空,存在时间短暂
  • 硬盘cookie保存在硬盘中,有一个过期时间,由用户手动清理或到过期时间自动清理

常见属性

  • 过期时间属性

    • expires 设置指定时间为过期时间

    • max-age 设置时长为过期时间

  • Domain cookie作用域

    • 如果不设置,默认是origin,不包含子域名
    • 如果指定Domain,则包含子域名
  • Path 指定主机下哪些域名可以接受cookie

    • 如果设置路径,则只有该路径及其子路径才携带cookie