JS高级——JSON、数据存储学习笔记

在目前的开发中,JSON是一种非常重要的数据格式,它并不是编程语言,而是一种可以在服务器和客户端之间传输的数据格式。

JSON的全称是JavaScript Object Notation(JavaScript对象符号):

  • JSON是由Douglas Crockford构想和设计的一种轻量级资料交换格式,算是JavaScript的一个子集;
  • 但是虽然JSON被提出来的时候是主要应用JavaScript中,但是目前已经独立于编程语言,可以在各个编程语言中使用;
  • 很多编程语言都实现了将JSON转成对应模型的方式;

目前JSON被使用的场景也越来越多:

  • 网络数据的传输JSON数据;
  • 项目的某些配置文件;
  • 非关系型数据库(NoSQL)将json作为存储格式;

一、JSON基本语法

JSON的顶层支持三种类型的值:

  • 简单值:数字(Number)、字符串(String,不支持单引号)、布尔类型(Boolean)、null类型;
    在这里插入图片描述

  • 对象值:由key、value组成,key是字符串类型,并且必须添加双引号,值可以是简单值、对象值、数组值;
    在这里插入图片描述

  • 数组值:数组的值可以是简单值、对象值、数组值;
    在这里插入图片描述

二、JSON序列化

某些情况下我们希望将JavaScript中的复杂类型转化成JSON格式的字符串,这样方便对其进行处理:

  • 比如我们希望将一个对象保存到localStorage中;
  • 但是如果我们直接存放一个对象,这个对象会被转化成 [object Object] 格式的字符串,并不是我们想要的结果;
    在这里插入图片描述

三、JSON序列化方法

在ES5中引用了JSON全局对象,该对象有两个常用的方法:

  • stringify方法:将JavaScript类型转成对应的JSON字符串;
  • parse方法:解析JSON字符串,转回对应的JavaScript类型;

在这里插入图片描述

在这里插入图片描述

四、Stringify的参数replace、space

JSON.stringify() 方法将一个 JavaScript 对象或值转换为 JSON 字符串:

  • 如果第二个参数指定了一个 replacer 函数,则可以选择性地替换值;
  • 如果第二个参数指定的 replacer 是数组,则可选择性地仅包含数组指定的属性;

它还可以跟上第三个参数space:

在这里插入图片描述
在这里插入图片描述
如果对象本身包含toJSON方法,那么会直接使用toJSON方法的结果:
在这里插入图片描述

五、parse方法

JSON.parse() 方法用来解析JSON字符串,构造由字符串描述的JavaScript值或对象。

  • 提供可选的 reviver 函数用以在返回之前对所得到的对象执行变换(操作)。
    在这里插入图片描述

六、使用JSON序列化深拷贝

另外我们生成的新对象和之前的对象并不是同一个对象:

  • 相当于是进行了一次深拷贝;
    在这里插入图片描述
    注意:这种方法它对函数是无能为力的
  • 创建出来的info中是没有foo函数的,这是因为stringify并不会对函数进行处理;
  • 我们后续会讲解如何编写深拷贝的工具函数,那么这样就可以对函数的拷贝进行处理了;

七、认识Storage

WebStorage主要提供了一种机制,可以让浏览器提供一种比cookie更直观的key、value存储方式:

  • localStorage:本地存储,提供的是一种永久性的存储方法,在关闭掉网页重新打开时,存储的内容依然保留;
    在这里插入图片描述

  • sessionStorage:会话存储,提供的是本次会话的存储,在关闭掉会话时,存储的内容会被清除;
    在这里插入图片描述

八、localStorage和sessionStorage的区别

我们会发现localStorage和sessionStorage看起来非常的相似。
那么它们有什么区别呢?

  • 验证一:关闭网页后重新打开,localStorage会保留,而sessionStorage会被删除;
  • 验证二:在页面内实现跳转,localStorage会保留,sessionStorage也会保留
  • 验证三:在页面外实现跳转(打开新的网页),localStorage会保留,sessionStorage不会被保留;

九、Storage常见的方法和属性

在这里插入图片描述

在这里插入图片描述

十、封装Storage

在开发中,为了让我们对Storage使用更加方便,我们可以对其进行一些封装:
在这里插入图片描述

class HYCache {constructor(isLocal = true) {this.storage = isLocal ? localStorage: sessionStorage}setItem(key, value) {if (value) {this.storage.setItem(key, JSON.stringify(value))}}getItem(key) {let value = this.storage.getItem(key)if (value) {value = JSON.parse(value)return value} }removeItem(key) {this.storage.removeItem(key)}clear() {this.storage.clear()}key(index) {return this.storage.key(index)}length() {return this.storage.length}
}const localCache = new HYCache()
const sessionCache = new HYCache(false)export {localCache,sessionCache
}

十一、认识IndexedDB

什么是IndexedDB呢?

  • 我们能看到DB这个词,就说明它其实是一种数据库(Database),通常情况下在服务器端比较常见;
  • 在实际的开发中,大量的数据都是存储在数据库的,客户端主要是请求这些数据并且展示;
  • 有时候我们可能会存储一些简单的数据到本地(浏览器中),比如token、用户名、密码、用户信息等,比较少存储大量的数据;
  • 那么如果确实有大量的数据需要存储,这个时候可以选择使用IndexedDB;

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

  • 它是一种事务型数据库系统,是一种基于JavaScript面向对象数据库,有点类似于NoSQL(非关系型数据库);
  • IndexDB本身就是基于事务的,我们只需要指定数据库模式,打开与数据库的连接,然后检索和更新一系列事务即可;
    在这里插入图片描述

11.1 IndexDB的连接数据库

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

// 打开数据(和数据库建立连接)
const dbRequest = indexedDB.open("why", 3)
dbRequest.onerror = function(err) {console.log("打开数据库失败~")
}
let db = null
dbRequest.onsuccess = function(event) {db = event.target.result
}
// 第一次打开/或者版本发生升级
dbRequest.onupgradeneeded = function(event) {const db = event.target.resultconsole.log(db)// 创建一些存储对象db.createObjectStore("users", { keyPath: "id" })
}class User {constructor(id, name, age) {this.id = idthis.name = namethis.age = age}
}
const users = [new User(100, "why", 18),new User(101, "kobe", 40),new User(102, "james", 30),
]// 获取btns, 监听点击
const btns = document.querySelectorAll("button")
for (let i = 0; i < btns.length; i++) {btns[i].onclick = function() {const transaction = db.transaction("users", "readwrite")console.log(transaction)const store = transaction.objectStore("users")switch(i) {case 0:console.log("点击了新增")for (const user of users) {const request = store.add(user)request.onsuccess = function() {console.log(`${user.name}插入成功`)}}transaction.oncomplete = function() {console.log("添加操作全部完成")}breakcase 1:console.log("点击了查询")// 1.查询方式一(知道主键, 根据主键查询)// const request = store.get(102)// request.onsuccess = function(event) {//   console.log(event.target.result)// }// 2.查询方式二:const request = store.openCursor()request.onsuccess = function(event) {const cursor = event.target.resultif (cursor) {if (cursor.key === 101) {console.log(cursor.key, cursor.value)} else {cursor.continue()}} else {console.log("查询完成")}}breakcase 2:console.log("点击了删除")const deleteRequest = store.openCursor()deleteRequest.onsuccess = function(event) {const cursor = event.target.resultif (cursor) {if (cursor.key === 101) {cursor.delete()} else {cursor.continue()}} else {console.log("查询完成")}}breakcase 3:console.log("点击了修改")const updateRequest = store.openCursor()updateRequest.onsuccess = function(event) {const cursor = event.target.resultif (cursor) {if (cursor.key === 101) {const value = cursor.value;value.name = "curry"cursor.update(value)} else {cursor.continue()}} else {console.log("查询完成")}}break}}
}

十二、认识Cookie

Cookie(复数形态Cookies),又称为“小甜饼”。类型为“小型文本文件,某些网站为了辨别用户身份而存储在用户本地终端(Client
Side)上的数据。

  • 浏览器会在特定的情况下携带上cookie来发送请求,我们可以通过cookie来获取一些信息;

Cookie总是保存在客户端中,按在客户端中的存储位置,Cookie可以分为内存Cookie和硬盘Cookie。

  • 内存Cookie由浏览器维护,保存在内存中,浏览器关闭时Cookie就会消失,其存在时间是短暂的;
  • 硬盘Cookie保存在硬盘中,有一个过期时间,用户手动清理或者过期时间到时,才会被清理;

如何判断一个cookie是内存cookie还是硬盘cookie呢?

  • 没有设置过期时间,默认情况下cookie是内存cookie,在关闭浏览器时会自动删除;
  • 有设置过期时间,并且过期时间不为0或者负数的cookie,是硬盘cookie,需要手动或者到期时,才会删除;

12.1 cookie常见的属性

在这里插入图片描述

12.2 客户端设置cookie

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

beautifulsoup获取属性_Python爬虫常用模块:BeautifulSoup

BeautifulSoup用途 BeautifulSoup 借助网页的结构和属性等特性来解析网页&#xff0c;可以用它来方便地从网页中提取所需信息。 BeautifulSoup自动将输入文档转换为Unicode编码&#xff0c;输出文档转换为UTF-8编码。BeautifulSoup依赖于解析器 它除了支持Python标准库中的HTML…

CSS3选择器的研究

属性选择器 [title]:选择带有title属性的元素 [titlehello]:选择属性是title并且值是hello的元素 [title~hello]:选择属性是title并且部分值是hello的元素&#xff0c;hello需要是单独的值&#xff0c;以空格分开 [title*hello]:选择属性是title并且其中包含了hello的元素 [tit…

手写实现简单的Vue事件总线

一、什么是事件总线 自定义事件总线属于一种观察者模式&#xff0c;其中包括三个角色&#xff1a; 发布者&#xff08;Publisher&#xff09;&#xff1a;发出事件&#xff08;Event&#xff09;&#xff1b;订阅者&#xff08;Subscriber&#xff09;&#xff1a;订阅事件&a…

手写实现深拷贝函数

对象相互赋值的一些关系&#xff0c;分别包括&#xff1a; 引入的赋值&#xff1a;指向同一个对象&#xff0c;相互之间会影响&#xff1b;对象的浅拷贝&#xff1a;只是浅层的拷贝&#xff0c;内部引入对象时&#xff0c;依然会相互影响&#xff1b;对象的深拷贝&#xff1a;两…

第一款支持容器和云部署的开源数据库Neo4j 3.0

导读Neo4j 3.0.0 正式发布&#xff0c;这是 Neo4j 3.0 系列的第一个版本。此版本对内部架构进行了全新的设计&#xff1b;提供给开发者更强大的生产力&#xff1b;提供更广阔的部署选择。Neo4j 3.0 被认为是世界上最具伸缩性的基于Java的图片数据库。Neo4j 3.0.0 主要的新特性&…

手写防抖和节流函数

一、认识防抖debounce函数 我们用一副图来理解一下它的过程&#xff1a; 当事件触发时&#xff0c;相应的函数并不会立即触发&#xff0c;而是会等待一定的时间&#xff1b;当事件密集触发时&#xff0c;函数的触发会被频繁的推迟&#xff1b;只有等待了一段时间也没有事件触…

中webgl解析json_WebGL蒙皮(下)

今天继续学习webgl一个重要功能&#xff1a;skinning(蒙皮)&#xff0c;内容来自学习网站webglfundamentals&#xff0c;这里仅供学习交流&#xff0c;原文链接&#xff1a;https://webglfundamentals.org/webgl/lessons/zh_cn/webgl-skinning.html。文章并非原创&#xff01;如…

Vue权限控制——动态注册路由

需求&#xff1a;实现后台管理系统不同用户的权限控制 根据登录的用户的角色动态展示后台管理系统的左侧菜单栏的菜单列表内容&#xff0c;然后还要动态注册对应子菜单的路由 菜单列表内容应该通过后端接口返回&#xff1a; sort为1表示当前项有子菜单sort为2表示当前项没有子…

react不同环境不同配置angular_前端问题集:vue配置环境-给不同的环境配不同的打包命令...

通过vue-cli脚手架构建出一个前端项目&#xff0c;通过npm run build打包&#xff0c;发布到线上&#xff0c;但是这样做需要每次都手动修改接口地址。我们可以通过自行配置打包命令实现无需修改接口地址&#xff0c;打各个环境的包。文档结构大致如下图&#xff1a;1.找到conf…

基于Element-plus封装配置化表单组件(组件的v-model实现)

一、预备知识 1.1 组件的v-model 前面我们在input中可以使用v-model来完成双向绑定&#xff1a; 这个时候往往会非常方便&#xff0c;因为v-model默认帮助我们完成了两件事&#xff1b;v-bind:value的数据绑定 和 input的事件监听&#xff1b; 如果我们现在封装了一个组件…

Scala IDE for Eclipse的下载、安装和WordCount的初步使用(本地模式和集群模式)

不多说&#xff0c;直接上干货&#xff01; 这篇博客是&#xff0c; 是在Scala IDEA for Eclipse里maven创建scala和java代码编写环境。 Scala IDEA for Eclipse里用maven来创建scala和java项目代码环境&#xff08;图文详解&#xff09; 本博文包括&#xff1a; Scala IDE fo…

笔记本AutoCAD启动时闪退怎么办_戴尔笔记本电脑开不了机如何解决【解决方法】...

生活在互联时代下&#xff0c;我们对笔记本的需求是无处不在的&#xff0c;不管是上班族还是学生党&#xff0c;使用笔记本办公和学习给我们的生活带来很大的便捷。但使用的过程中&#xff0c;总有可能会遇到无法预料的问题。比方说 笔记本电脑 无法开机的问题&#xff0c;当…

JS高级——函数执行、作用域链内存结构图

一、JavaScript的执行过程 假如我们有下面一段代码&#xff0c;它在JavaScript中是如何被执行的呢&#xff1f; 1.1 第一步&#xff1a;初始化全局对象 js引擎会在执行代码之前&#xff0c;会在堆内存中创建一个全局对象&#xff1a;Global Object&#xff08;GO&#xff09…

JS高级——内存管理和闭包

0、预备知识 0.1 认识内存管理 不管什么样的编程语言&#xff0c;在代码的执行过程中都是需要给它分配内存的&#xff0c;不同的是某些编程语言需要我们自己手动的管理内存&#xff0c;某些编程语言会可以自动帮助我们管理内存&#xff1a; 不管以什么样的方式来管理内存&…

提取多个字段_【博客翻译】建筑物轮廓线提取以及损坏分类

原文链接原作者&#xff1a;Rohit Singh, Sandeep Kumar贡献者&#xff1a;Vinay Viswambharan, Divyansh Jha, Shivani Pathak, Daniel Wilson.翻译&#xff1a;荆雪涵在今年的 Esri 用户大会上&#xff0c;USAA 展示了基于 ArcGIS 深度学习能力&#xff0c;对 Woolsey 火灾进…

读取外部配置文件_SpringBoot外部配置、优先级及配置详解

一、外部配置及优先级SpringBoot的外部配置属性值官方给出了很多种方式&#xff0c;以便可以在不同的环境中使用相同的代码。其使用了非常特别的PropertySource命令&#xff0c;旨在允许合理的覆盖值。当然&#xff0c;如果属性值不同&#xff0c;则这些配置方式中的属性值都会…

Jquery 禁用浏览器的 后退和前进按钮

使用js,Jquery 禁用浏览器的back 和 next 按钮&#xff1a; 有时为了防治用户乱了访问顺序&#xff0c;不得不禁掉浏览器的前进后退按钮。 jQuery(document).ready(function () {if (window.history && window.history.pushState) {$(window).on(popstate, function ()…

JS数据结构与算法——冒泡排序(把大的数字依次往后放)

一、图解排序过程 注意&#xff1a;比较次数和交换次数之所以不一致&#xff0c;是因为&#xff1a;比较了并不一定就需要交换两个数字的位置&#xff0c;比如比较 1 和 2两个数字&#xff0c;由于 后者本身就比前者大&#xff0c;所以不需要交换两者的位置。 二、代码实现 三…

手机长曝光怎么设置_摄影教程丨手机如何拍摄长曝光照片,流光快门,星空银河搞起来!...

微信搜一搜定格取景框长曝光摄影可以拍摄出一些很酷的照片。这是一种非常灵活的摄影技术。它可以用来拍摄城市夜景&#xff0c;记录光绘&#xff0c;也可以拍摄水景片。甚至可以拍摄银河或捕捉星轨。其实长曝光不仅仅适合专业摄影师&#xff01;任何人都可以用手机进行慢门拍摄…

JS数据结构与算法——选择排序(把小的数字依次往前放)

一、图解排序过程 注意&#xff1a;选择排序一样是需要进行两两的比较&#xff0c;但比较过程中不进行交换&#xff0c;只有比较完成后&#xff0c;找到最小的那个数&#xff0c;才会进行交换&#xff0c;把它放到最前面。 二、代码实现 三、完整代码 <!DOCTYPE html> &…