當我們使用 JSON.stringify() 序列化壹個值為JSON字符串,只有 JSON安全的值 才可以通過 JSON.stringify() 轉換為字符串。那麽,什麽是 JSON安全的值 ?能夠有效用JSON形式表示的任何值。
非JSON安全的值,例如: undefined 、 function 和 symbol 以及循環引用的object(對象結構的屬性引用通過創建彼此,構成壹個無限循環)。對壹個標準的JSON結構來說,這些值都是非法的,主要是因為它們無法移值到其他支持JSON的語言中。
當 JSON.stringify() 遇到 undefined 、 function 和 symbol 的時候,會自動忽略它們的值,如果這樣的值在數組中會被替換成 null (這樣數組的索引信息就不會被改變)。如果這樣的值出現在對象的屬性中,那這個屬性會被排除掉。
JSON字符串有壹個特殊的行為,如果壹個對象定義了 toJSON() 方法,那這個方法先被調用,並且將它返回的值進行序列化。
如果將壹個含有非法JSON值的對象序列化成JSON字符串,需要定義壹個 toJSON() 方法,用於返回該對象的JSON安全版本。
JSON.stringify()第二個參數是個可選參數,被稱為replacer。這個參數可以是數組或者函數。它提供了壹個過濾機制制定了應該或者不應該包含哪些屬性,從而實現了對象可定制的遞歸序列化,這種做法和toJSON()如何序列化準備壹個值很相似。
如果replacer是壹個數組,它應該是壹個字符串數組,每壹個值都指定了對象的屬性名稱,代表屬性應該被加入到序列化中,如果壹個屬性不在這個列表中,它會被跳過。
如果replacer是壹個函數,它首先會被該對象調用壹次,然後該對象的每個屬性會調用壹次,每次都會給這個函數傳遞兩個值,key和value。想在序列化過程中跳過某個key,只需要返回undefined,否則返回提供的value。
第三個可選的參數也可以傳遞給JSON.stringify(),被稱為space,被用作縮進,是為了使得輸出有格式更加漂亮。space可以是壹個正整數,指定每層縮進應該縮進多少個空格。或者space也可以是個字符串,其值的前十個字符被用於每個縮進層次。