问题
如标题,js中对象json序列化方法JSON.stringfy()输出非空对象,结果为'{}'
如果你想获取中国联通当前的网络类型,可以在网上找到两种方法。 一种是使用navigator.userAgent中包含的NetType信息来确定javascript json序列化,另一种是通过navigator.connection中的type数组来确定。
测试结果还是不理想,我开始怀疑判断所依据的数组或者字符串不存在。 但我不知道navigator中除了ua之外还有哪些信息,所以想输出全局变量navigator来看看。
Alert(JSON.stringfy(navigator)) 的结果仍然是“{}”。 尽管我通过console.log(navigator)输出对象内容得到了我想要的结果,但我还是很好奇为什么专门用于js中序列化对象的JSON.stringfy()不起作用。
解决
网上查了资料,你可能不知道JSON.stringfy的用法。 上面说过javascript json序列化,JSON.stringfy()的用途很广泛,很多js框架底层的toJson()都是用这个来实现的。 而且它对单个值的处理是出人意料的,例如 JSON.stringify() 会将 NaN 和 Infinity 转换为 null:
const obj = { nan: parseInt('not a number'), inf: Number.POSITIVE_INFINITY };
JSON.stringify(obj); // '{"nan":null,"inf":null}'
还有一种情况会抛出error异常:
const obj = {};
// 存在循环引用的对象,它指向它本身
obj.prop = obj;
// 会抛出 "TypeError: TypeError: Converting circular structure to JSON" 异常
JSON.stringify(obj)
不过,JSON.stringify() 也会直接省略这些值为 function 和 undefined 的属性,如下:
const obj = { fn: function() {}, undef: undefined };
// 它会返回空对象
JSON.stringify(obj); // '{}'
因此,json序列化返回'{}',因为导航器不是纯数据,它内部包含一些函数。
当然,通过 JSON.stringify(obj) 输出无法查看对象内容。