共计 1441 个字符,预计需要花费 4 分钟才能阅读完成。
JSON 是什么?
JSON 是一种语法,能够用来序列化对象、数组或者数字等数据类型。换句话说,咱们能够利用 JSON 来将数据转成字符串的模式。
常见的 API
JSON.parse
- 性能
还原被序列化的数据(反序列化),行将字符串还原为它原本的数据结构。
-
参数
text
,行将要被「反序列化」的字符串reviver
,解决字符串的回调函数,能够参加到「反序列化」的过程,遍历程序是由内到外
JSON.stringify
- 性能
序列化一个值,行将一个值转为字符串的模式。
-
参数
value
,将要被序列化的值-
replacer
- 如果该值是函数,那么它会参加到序列化的过程当中
- 如果该值是数组,那么只有蕴含在数组里的属性才会被序列化
- 如果该值是 null 或者 undefined,那么所有属性都会被序列化
应用场景
本地缓存
常常应用的本地缓存如 localStorage
,对于存入的数据是有要求的:键名和值都只能是 string
类型。
而这时 JSON
就能够派上用场了????
- 存储
localStorage.set(key, JSON.stringify(data))
- 提取
localStorage.getItem(key, JSON.parse(str))
解决 Date 对象
如果对象里有 Date
对象,那么序列化之后后果是这样的????
"2020-07-29T14:47:09.608Z"
这时候就头疼了,咱们须要再写一个函数来解决反序列化之后的后果吗?
别忘了下面提到的参数,无论是 parse
还是 stringify
都容许传入一个参数来管制序列化 / 反序列化,因而咱们能够这样来解决 Date
的对象????
let obj = {
text: 'just do it',
date: new Date()}
let str = JSON.stringify(obj)
let org = JSON.parse(str, (key, val) => {
// 如果是 date 就转成 Date
if (key === 'date') {return new Date(val)
}
return val
})
解决 RegExp 对象
当初场景更加简单了,你须要解决 RegExp
对象了,这时候要怎么做呢?手快的同学可能就间接开动了????
let obj = {reg: /\d+/}
let str = JSON.stringify(obj)
let org = JSON.parse(str)
实际上,间接序列化一个 RegExp
对象只会返回一个 "{}"
(不信你试试)
别忘了,RegExp
构造函数能够传入这两个参数:
source
flags
因而咱们只有对蕴含 RegExp
对象的属性在序列化与反序列化时做特地解决即可????
// 序列化 RegExp 对象
let obj = {reg: /\d+/}
let str = JSON.stringify(obj, (key, val) => {if (key === 'reg') {
return {
source: val.source,
flags: val.flags
}
}
return val
})
// 反序列化
let org = JSON.stringify(str, (key, val) => {if (key === 'reg') {return new RegExp(val.source, val.flags)
}
return val
})
判断对象是否为空
咱们也能够利用 JSON.stringify
来判断某个对象是否为空(没有任何属性)????
const isObjectEmpty = (obj) => {return JSON.stringify(obj) === '{}' && !obj.__proto__}
总结
正文完