問題
如題,js 中對象 json 序列化方法 JSON.stringfy () 輸出非空對象結果為 '{}'
想要獲取移動端當前的網絡類型,在網上找到兩個方法,一個是借助 navigator.userAgent
里面包含的 NetType
信息判斷,還有一個是 navigator.connection
中的 type
字段判斷的。
測試結果一直不如意,開始懷疑判斷所依據的字段或者字符串並不存在。而對於 navigator
中除了 ua
之外還有哪些信息並不知道,所以想輸出全局變量 navigator
看一下。
alert(JSON.stringfy(navigator))
結果一直為 '{}'。雖然通過 console.log(navigator)
輸出對象內容,得到了我想要的東西,但我還是好奇,為什么在 js 中專門用來序列化對象的 JSON.stringfy()
會不起作用。
解決
網上查看了一下資料,你可能不知道的 JSON.stringfy 用法。里面提到,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}'
還有一種會拋出錯誤異常的情況:
const obj = {}; // 存在循環引用的對象,它指向它本身 obj.prop = obj; // 會拋出 "TypeError: TypeError: Converting circular structure to JSON" 異常 JSON.stringify(obj)
並且,JSON.stringify () 也會直接省略那些值為 functions 和 undefined 的屬性,如下:
const obj = { fn: function() {}, undef: undefined }; // 它會返回空對象 JSON.stringify(obj); // '{}'
所以,json 序列化返回 '{}',就是因為 navigator 並不是一個純粹的數據,它內部包含了一些 functions。
這樣自然就不能通過 JSON.stringify(obj)
輸出查看到對象內容了。