工具函數JSON.stringify()將JSON對象序列化為字符串時也用到了ToString.
看下面的代碼:
console.log(JSON.stringify(42));
console.log(JSON.stringify("42"));
console.log(JSON.stringify(null));
console.log(JSON.stringify(true));
所有安全的JSON值都可以使用JSON.stringify字符串化.
安全的JSON值: 能夠呈現為有效JSON格式的值
不安全的JSON值:
// undefined、function、symbol
// 遇到以上類型時會自動忽略(undefined)
console.log(JSON.stringify(undefined));
console.log(JSON.stringify(function(){}));console.log(JSON.stringify([1, undefined, function(){},4]));
console.log(JSON.stringify({a:2, b:function(){}}));
如果對象中定義了toJSON方法,JSON字符串化時會首先調用該方法,然后用它的返回值來進行序列化.
// 未定義toJSON,一個循環引用
var o ={};
var a = {b: 42,c: o,d: function(){}
};
o.e = a;
JSON.stringify(a);
// 自定義toJSON,返回一個安全的JSON值
var o = {};
var a = {b: 42,c: o,d: function(){}
};
a.toJSON = function(){return { b: this.b};
};
console.log(JSON.stringify(a));
可以使用toJSON方法來返回一個相對安全的值.
// toJSON()應該"返回一個能夠唄字符串化的安全的JSON值",而不是"返回一個JSON字符串"
var a ={val: [1,2,3],toJSON: function() {return this.val.slice(1)}
};
var b = {val:[1,2,3],toJSON: function() {return "[" + this.val.slice(1).join() + "]";}
};
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));
// 可以看出第二個函數,是對toJSON返回的字符串做字符串化,而非數組本身.
我們還可以向JSON.stringify()傳遞一個可選參數replacer用來指定對象序列化過程中哪些屬性應該被處理
// replacer參數
var a = {b: 42,c: "42",d: [1,2,3]
};
console.log(JSON.stringify(a, ["b", "c"])); // 需要key為b 或 c的
console.log(JSON.stringify(a, function(k,v){if(k !== "c") return v;
}));
space(可選參數)
// JSON.stringify還有一個可選參數space,用來指定輸出的縮進格式
var a ={b: 42,c: "42",d: [1,2,3]
};
console.log(JSON.stringify(a, null, 1));
console.log(JSON.stringify(a, null, 3));
console.log(JSON.stringify(a, null, '--'));
參考《你不知道的JavaScript》(中卷)P48~P52