重写stringify 解决序列化循环依赖对象报错,解决方式,对已访问对象建立索引,已访问过的对象不再处理
var stringify = (function () { var toString = Object.prototype.toString; var isArray = Array.isArray || function (a) { return toString.call(a) === '[object Array]'; }; var escMap = { '"': '\"', '\': '\\', '': '\b', 'f': '\f', ' ': '\n', ' ': '\r', ' ': '\t' }; var escFunc = function (m) { return escMap[m] || '\u' + (m.charCodeAt(0) + 0x10000).toString(16).substr(1); }; var escRE = /[\"u0000-u001Fu2028u2029]/g; var visitedObjs = []; return function stringify(value) { if (value == null) { return 'null'; } else if (typeof value === 'number') { return isFinite(value) ? value.toString() : 'null'; } else if (typeof value === 'boolean') { return value.toString(); } else if (typeof value === 'object') { if (typeof value.toJSON === 'function') { return stringify(value.toJSON()); } else if (isArray(value)) { var res = '['; for (var i = 0; i < value.length; i++) res += (i ? ', ' : '') + stringify(value[i]); return res + ']'; } else if (toString.call(value) === '[object Object]') { if (visitedObjs.indexOf(value) > -1) { return '[Visited Object]'; } else { visitedObjs.push(value); var tmp = []; for (var k in value) { if (value.hasOwnProperty(k)) tmp.push(stringify(k) + ': ' + stringify(value[k])); } return '{' + tmp.join(', ') + '}'; } } } return '"' + value.toString().replace(escRE, escFunc) + '"'; }; })();