前段時間勾股有提到stringify是支持三個參數,刷新的了個人認知,後來查到文檔才發現還真的是支持三個參數的。javascript
參考資料:java
stringify方法顧名思義,就是把JSON序列換,其語法以下:數組
JSON.stringify(value[, replacer [, space]])
注意到它接收三個參數,後面2個參數是可選的。函數
1 var data = {name:"niuzai",info:{age:18,sex:"male"}}; 2 3 JSON.stringify(data); //{"name":"niuzai","info":{"age":18,"sex":"male"}}
這裏要注意:stringily對data裏的數據類型有一些要求:spa
1 JSON.stringify({x: 5, y: 6}); 2 // '{"x":5,"y":6}' 或者 '{"y":6,"x":5}' 均可能
undefined
、任意的函數以及 symbol 值,在序列化過程當中會被忽略(出如今非數組對象的屬性值中時)或者被轉換成 null
(出如今數組中時)。1 var obj = {"undefined":undefined,"func":function(){},"symbol":Symbol("")}; 2 JSON.stringify(data); //"{}" 3 4 var arr = [undefined,Symbol(""),function(){}]; 5 JSON.stringify(arr); //[null,null,null]
replacer
參數中強制指定包含了它們。JSON.stringify({[Symbol("foo")]: "foo"}); //'{}'
1 JSON.stringify( Object.create(null, { x: { value: 'x', enumerable: false }, y:{value: 'y', enumerable: true } }) ); 2 // '{"y":"y"}'
第二個參數頗有意思,能夠爲一個過濾函數,也能夠是一個數組。code
當爲數組時被序列化的值的每一個屬性都會通過該函數的轉換和處理,當爲數組時則只有包含在這個數組中的屬性名纔會被序列化到最終的 JSON 字符串中。對象
過濾函數仍是比較有意思的,你能夠控制輸出,好比以前提到的會被忽略的類型,能夠在這裏人工的處理,強制輸出(固然是別的類型)。blog
1 var data = { 2 name:"niuzai", 3 info:{ 4 age:18, 5 sex:"male" 6 } 7 }; 8 9 JSON.stringify(data, function(key, val){ 10 console.log("key is %s", key); 11 console.log("val is %s", typeof(val)); 12 return val; 13 }); 14 //key is 15 //key is 16 //val is object 17 //key is name 18 //val is string 19 //key is info 20 //val is object 21 //key is age 22 //val is number 23 //key is sex 24 //val is string 25 "{"name":"niuzai","info":{"age":18,"sex":"male"}}"
注意:這裏必定要return一個值給下一個遍歷函數做爲參數傳入,若是不return的話,後面的遍歷就無法玩下去了。ip
1 JSON.stringify(data, ["name", "info", "sex"]); 2 3 //age因爲不在列表裏,因此沒被序列化 4 //"{"name":"niuzai","info":{"sex":"male"}}"
第三參數space
用來控制結果字符串裏面的間距。若是是一個數字, 則在字符串化時每一級別會比上一級別縮進多這個數字值的空格(最多10個空格);若是是一個字符串,則每一級別會比上一級別多縮進用該字符串(或該字符串的前十個字符)。文檔
1 JSON.stringify(data,null,10); 2 //每個層級比上一個多10個空格 3 "{ 4 "name": "niuzai", 5 "info": { 6 "age": 18, 7 "sex": "male" 8 } 9 }" 10 11 JSON.stringify(data,null,'\t'); 12 //每個層級比上一個多一個製表符 13 "{ 14 "name": "niuzai", 15 "info": { 16 "age": 18, 17 "sex": "male" 18 } 19 }"
若是一個被序列化的對象擁有 toJSON
方法,那麼該 toJSON
方法就會覆蓋該對象默認的序列化行爲
1 var data = { 2 name:"niuzai", 3 info:{ 4 age:18, 5 sex:"male" 6 }, 7 toJSON:function(){ 8 return "by toJSON"; 9 } 10 }; 11 12 JSON.stringify(data); 13 //""by toJSON"";
注意:這裏的toJSON必須是一個function,若是是別的類型就不行了,好比以前提到的數組。