深度使用JSON.stringify()
按照 JSON 的规范,使用 JSON.stringify() 做对象序列化时,如果一个属性为函数,那这个属性就会被忽略。
const data1 = {
a: 'aaa',
fn: function() {
return true
}
}
JSON.stringify(data)
// 结果是 "{"a":"aaa"}"
还有一种情况,一个属性的值为 undefined
const data2 = {
a: 'abc',
b: undefined
}
JSON.stringify(data2)
// 结果是 "{"a":"abc"}"
如果属性为 null 则可以正常序列化这个属性:
const data3 = {
a: 'abc',
b: null
}
JSON.stringify(data3)
// 结果是 "{"a":"abc","b":null}"
因为null可表示已经赋值,而undefined表示未定义、未赋值,所以执行JSON.stringify不会处理。
stringify 函数
stringify 函数的定义为 JSON.stringify(value [, replacer [, space]])
后面还带有我不常用两个可选参数 replacer 和 space
value 参数不多解释,replacer 其实就是一个自定义函数,可以改变 JSON.stringify 的行为,space 就是格式化输出,最大值为 10,非整数时取值为 1
stringify 输出 Function
本质上无论怎么改,stringify 还是不会输出 Function,但是 Function 可以调用 toString() 方法的,所以思路就很明了了。
const data1 = {
a: 'aaa',
fn: function() {
return true
}
}
const replace = function(k ,v) {
if(typeof v === 'function') {
return Function.prototype.toString.call(v)
}
return v
}
JSON.stringify(data1, replace)
// 结果 "{"a":"aaa","fn":"function () {\n return true\n }"}"
同理可证 undefined 也能输出了
const replace = function(k ,v) {
if(v === undefined){
return 'undefined'
}
return v
}
stringify 格式化输出
JSON.stringify 的第三个参数很简单,相当于我们编辑器的 tab_size
const data4 = {
a: 'abc',
b: null,
c: {
x: 'xxx',
y: 'yyy',
z: 2046
},
d: 9527
}
JSON.stringify(data4, null, 2);
// 输出结果
/*
"{
"a": "abc",
"b": null,
"c": {
"x": "xxx",
"y": "yyy",
"z": 2046
},
"d": 9527
}"
*/
toJSON 方法
toJSON 是个覆盖函数,尽量少用,看了代码就懂了:
const data5 = {
a: 'abc',
b: null,
c: {
x: 'xxx',
y: 'yyy',
z: 2046
},
d: 9527,
toJSON: function() {
return 'WTF'
}
}
JSON.stringify(data5, null, 2);
// 结果返回 "WTF"
深度使用JSON.stringify()的更多相关文章
- 【Immutable】拷贝与JSON.parse(JSON.stringify()),深度比较相等与underscore.isEqual(),性能比较
样本:1MB的JSON文件,引入后生成500份的一个数组: 结果如下: 拷贝性能: JSON.parse(JSON.stringify()) 的方法:2523.55517578125ms immuta ...
- javascript 数组和对象的浅复制和深度复制 assign/slice/concat/JSON.parse(JSON.stringify())
javascript 数组和对象的浅度复制和深度复制在平常我们用 ‘=’来用一个变量引用一个数组或对象,这里是‘引用’而不是复制下面我们看一个例子引用和复制是什么概念 var arr=[1,2,3,' ...
- JSON.stringify()的深度使用
在使用JSON.stringify()对JSON数据进行序列化时 1> 如果里面的属性是function,则会被忽略 const data = { a: 'a', fn: funciton() ...
- JSON.parse(JSON.stringify()) 实现对对象的深度拷贝,从而互不影响
JSON.parse(JSON.stringify({"key": "value"})) 根据不包含引用对象的普通数组深拷贝得到启发,不拷贝引用对象,拷贝一个字 ...
- angular,,以及深度拷贝问题;JSON.parse,JSON.stringify灵活运用
问题: $scope.list = [];$scope.listTree = {};$scope.dataTree = []; //获取listTree的数据$scope.getList = func ...
- JSON.parse()和JSON.stringify()&&traditional(ajax请求)的作用
parse是一个字符串中解析出json对象,如 var str = '{"name":"haizeiwang"}' 结果: JSON.parse(str) na ...
- js 中 new call apply bind JSON.stringify 的原理以及模拟实现
1.new的原理和实现 它创建了一个全新的对象. 它会被执行 [[Prototype]](也就是 __proto__)链接. 它使 this指向新创建的对象. 通过 new创建的每个对象将最终被 [[ ...
- JSON.parse()和JSON.stringify()
1.parse 用于从一个字符串中解析出json 对象.例如 var str='{"name":"cpf","age":"23&q ...
- JSON.stringify()与JSON.parse()
JSON.stringify()用于把一个对象解析成字符串,如 var student = { age: 23, name: 'wang' } JSON.stringify(student); 结果: ...
随机推荐
- grid实战之微信钱包 腾讯服务界面
网格布局简介 CSS3网格布局是让开发人员设计一个网格并将内容放在这些网格内.而不是使用浮动制作一个网格,实际上是你将一个元素声明为一个网格容器,并把元素内容置于网格中. 有一些浏览器是不支持网格布局 ...
- Java的三魂七魄 —— 高级多线程
目录 Java的三魂七魄 -- 高级多线程 一.多线程的创建 二.线程安全问题 三.线程通信问题 四.更多实例 1.用线程同步的方法解决单例模式的线程安全问题 2.银行存钱问题(线程安全问题) 3.生 ...
- webpack进阶(三)
1)CommonsChunkPlugin已经从webpack4移除,所以在用webpack进行公共模块的拆分时,会报错 Cannot read property 'CommonsChunkPlugin ...
- 进程,线程,Event Loop(事件循环),Web Worker
线程,是程序执行流的最小单位.线程可与同属一个进程的其他线程共享所拥有的全部资源,同一进程中的多个线程之间可以并发执行.线程有就绪,阻塞,运行三种基本状态. 阮一峰大神针对进程和线程的类比,很是形象: ...
- eclipse代码提示完善
转载请注明出处:https://www.cnblogs.com/Higurashi-kagome/p/12263267.html 1.参考https://blog.csdn.net/ithomer/a ...
- ES6中的find与filter的区别
一直以来以为find和filter是一样的效果,最近在梳理,才发现是不一样的. 首先,filter和find区别:filter返回的是数组,find返回的是对象. 注意:find()找到第一个元素后就 ...
- javaScript 基础知识汇总(九)
1.Rest 参数 与 Spread 操作符 当我们在代码中遇到“..."时,它不是Rest参数就是Spread操作符 区分方法: 若...出现在函数的参数列表,那它表示的就是Rest参数, ...
- BNP Paribas Cardif Claims Management
2月20日: 查看任务介绍,二分类问题,评价标准logloss 下载数据 2月21~27日: 查看数据组成,标识分类变量.离散变量.连续变量. 发现连续数据有大量非随机空缺(占总量一半),主要集中在v ...
- 基于Ubuntu的ORB-SLAM2项目环境搭建过程
目录 关于ORB-SLAM2 环境搭建 已有环境 创建环境 新建项目目录 安装Pangolin 安装OpenCV 3.2 安装Eigen DBoW2 and g2o (Included in Thir ...
- Apex_2. LiveBos两个时间求相差天数、历时
(1)获取两个时间相差天数(没有上午下午区分) var d1=ABS_DATESTRING(FStartTime,'yyyy/MM/dd'); var d2=ABS_DATESTRING(FEndTi ...