• 主页
  • 归档
  • 分类
  • 照片墙
所有文章 友情链接 关于我

  • 主页
  • 归档
  • 分类
  • 照片墙
  1. 1. 对于不同对象的处理
  2. 2. toJSON
  3. 3. 深拷贝
  4. 4. 另外两个参数

重新认识JSON.stringify

2019-12-11 21:18:56
总字数 793
预计阅读时间 3 分钟

JSON.stringify方法用于将对象进行序列化
但是对于不同的对象,该方法有不同的表现,并且也可以巧妙利用它去优雅地达到一些目的

对于不同对象的处理

1
2
3
4
5
6
7
8
9
10
const data = {
a: "aaa",
b: undefined,
c: Symbol("dd"),
fn: function() {
return true
},
arr: [1, undefined, Symbol("ee"), function(){}]
}
JSON.stringify(data) // {"a":"aaa","arr":[1,null,null,null]}

undefined、任意的函数以及symbol作为对象属性值时 JSON.stringify() 将跳过(忽略)对它们进行序列化
如果上述几种对象是数组当中的元素,将被序列化为 null
如果上述几种对象单独执行序列化,得到的结果都是 undefined

1
2
3
4
5
6
const data = {
a: NaN,
b: Infinity,
c: null
}
JSON.stringify(data) //{"a":null,"b":null,"c":null}

NaN、Infinity和null都会被序列化为null
对其单独执行也都是null

toJSON

如果转换的对象当中包含toJSON函数
转换的结果将是该函数的返回值

1
2
3
4
5
6
7
const data = {
a: "aaa",
toJSON() {
return "Hello"
}
}
JSON.stringify(data) // "Hello"

对于其中的每一个嵌套的对象,同样符合该特点

基于上述特性,对于Date对象,是可以正常序列化为UTC时间的字符串的
因为Date对象本身实现了该方法

深拷贝

如果可以不在意对特殊对象的处理,我们可以利用 JSON.stringify 来简单实现深拷贝
但是如果对象当中出现循环引用
就会抛出错误

1
2
3
4
5
6
7
8
9
10
11
12
13
const data = {
a: 10
}
data.loopData = data

JSON.stringify(data)
/*
Uncaught TypeError: Converting circular structure to JSON
--> starting at object with constructor 'Object'
--- property 'loopData' closes the circle
at JSON.stringify (<anonymous>)
at <anonymous>:6:18
*/

另外两个参数

JSON.stringify 还有另外两个可选参数replacer和space

replacer可以是一个函数,接收key和value两个参数,分别是对象中成员的键和值
该函数的返回值将被作为序列化的结果

所以我们可以利用这个函数,来改变上面提到的一些默认行为

1
2
3
4
5
6
7
8
9
10
11
const data = {
a: '11',
b: undefined
}
JSON.stringify(data, (key, value)=>{
if(typeof value === 'undefined') {
return null
}
return value
}) // {"a":"11","b":null}

replacer参数也可以是一个数组
含义就是只有在这个数组当中包含的元素作为的key才会被序列化,其余会被忽略

1
2
3
4
5
const data = {
a: '11',
b: '22'
}
JSON.stringify(data, ['b']) // {"b":"22"}

当然,按照开头提到的规则,该被忽略的还是会被忽略,哪怕它存在于这个数组当中

space这个参数用于美化输出

指定缩进用的空白字符串;如果参数是个数字,它代表有多少的空格;上限为10。该值若小于1,则意味着没有空格;如果该参数为字符串(当字符串长度超过10个字母,取其前10个字母),该字符串将被作为空格;如果该参数没有提供(或者为 null),将没有空格。

  • JavaScript
  • JavaScript

扫一扫,分享到微信

linux守护进程
Flutter踩坑记录 
© 2024 夏夜梦星辰
鲁ICP备19028444号
Power By Hexo
  • 所有文章
  • 友情链接
  • 关于我
{{searchItem.query}}
标签: 分类:
  • maven
  • 持续集成
  • JMS
  • 线程
  • JavaScript
  • ECMAScript6
  • 单元测试
  • Promise
  • Web Worker
  • 函数
  • prototype
  • 模块化
  • 正则表达式
  • 数据库
  • MongoDB
  • 索引
  • 集群
  • 全文检索
  • flutter
  • dart
  • git
  • 版本控制
  • linux
  • shell
  • docker
  • nginx
  • jenkins
  • opencv
  • vim
  • react
  • react native
  • 前端
  • css
  • HTML5
  • Hexo
  • sass
  • Three.js
  • TypeScript
  • Vue
  • 组件化
  • base64
  • webpack
  • nodejs
  • gulp
  • TensorFlow
  • 机器学习
  • 算法
  • 动态规划
  • 数据结构
  • Java
  • JavaScript
  • MongoDB
  • flutter
  • Git
  • linux
  • react
  • 前端杂烩
  • 男生女生
  • 算法
  • 十年饮冰,难凉热血
  • †少女癌†
  • 猫与向日葵
  • coderfun
  • JENKINS
  • API管理后台
愿你最终能接纳每一面每一种的自己
独自活着便是团圆