深度使用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 ...