**
1、起因
大概就是说JSON.stringify()在字符化对象时,当值是undefined或者null时,会返回不同的结果。这种区别可能会带来一些问题,最好统一输出结果。因此需要实现一个方法undefinedToNull(arg),能将undefined转化为null。
2、自己的解决思路
最容易的想法就是根据参数类型去递归的遍历,当遇到值为undefined时,将其手动设置为null。然后再用JSON.stringify()返回。但是这种简单粗暴的方法肯定不适在生产环境中使用,一来是比较复杂,需要判断多种参数类型,二来是可能有一些边界情况容易忽略。
思考一阵后,想到JSON.stringify()方法好像还有其他参数可以用,大致用法有点类似拦截器,但是由于实际工作中几乎没有用过,对于参数的具体用法不太清楚,遂重新查资料,复习了JSON.stringify()的具体用法。
3、JSON.stringify()的用法
3.1 value
需要进行JSON化的值,通常就是我们传入的一个对象字面量,比如{a:1}
3.2 replacer (可选)
可以是函数或数组,如果不是这两种,比如null或者不传,则value中所有的string-keyed 的属性都会包含在结果中返回。
重点1、当replacer 是函数时,接收两个参数(key,value),仅限于可枚举的属性可以进行字符化,相当于Object.keys()的结果。当value中含有空字符串“”作为key时,会首先执行空字符串对应值的字符化。如果value是数组,则key是对应的索引。replacer 的返回值会替换对应key原来的value值。返回值有以下几种情况:
1、如果返回值是number、string、boolean或者null,会直接作为结果,替换原来的value值。
2、如果是返回一个function、Symbol或者undefined,这个属性不会包含在字符化的结果中。
3、如果是返回其他对象,则会递归的调用replacer来字符化该对象。
需要特别注意的是,数组中的元素不管是什么类型都不会被忽略,undefined, Function, and Symbol这些非法的JSON值,会被转化成null。
3.3 space(可选)
可以是number或者string,通常用来控制输出的间距,美化输出结果。但是字符长度不超过10,number不大于10。实际用的很少。
3.4 其他
JSON.stringify()不能用于字符化带有循环引用的对象。可以cycle.js或者structuredClone()代替。
4、面试题结论和反思
利用replacer来判断value的类型,如果时undefined的,则返回null。
反思:不要仅限于JS中各API常见的使用方法,而要做深入的了解,至少要有个印象,有些场景下,会提供很多便利。MDN是个非常不错的使用手册,没事的时候多看一下
**