JSON.stringify大家已經不陌生了,是一個將json對象轉換為字符串的方法。但是如果你在瀏覽器控制台中輸出 JSON.stringify(window). 如果期望輸出一段文字, 可能會失望了. 事實上, 會輸出結果如下:
VM211:1 Uncaught TypeError: Converting circular structure to JSON
at JSON.stringify (<anonymous>)
at <anonymous>:1:6
上面的錯誤信息告訴我們, 對象中存在循環引用. 解決思路就是通過自定義stringify方法,設置一個全局緩存變量,stringify的第二個參數如果是function時,他會傳入每個成員的鍵和值。使用返回值而不是原始值。如果此函數返回 undefined,則排除成員。根對象的鍵是一個空字符串:""。所以,便有了如下解決方案:
var o = {};
o.o = o;
// 聲明cache變量,便於匹配是否有循環引用的情況
var cache = [];
var str = JSON.stringify(o, function(key, value) {
if (typeof value === 'object' && value !== null) {
if (cache.indexOf(value) !== -1) {
// 移除
return;
}
// 收集所有的值
cache.push(value);
}
return value;
});
cache = null; // 清空變量,便於垃圾回收機制回收
如上即可解決json字符串化循環引用的問題。