我的回答
字符串不处理
数字变成字符串
布尔值转字符串
函数直接剔除
null转字符串
对象使用对象的toString或者valueOf方法
NaN剔除
参考回答
JSON.stringify([,replacer,[,space]])方法是将一个 JavaScript 值(对象或者数组)转换为一个 JSON 字符串。此处模拟实现,不考虑可选的第二个参数 replacer 和第三个参数 space
转换规则如下:
- 基本数据类型
- undefined 转换之后仍是 undefined(类型也是 undefined)
- boolean 值转换之后是字符串 “false”/“true”
- number 类型(除了 NaN 和 Infinity)转换之后是字符串类型的数值
- symbol 转换之后是 undefined
- null 转换之后是字符串 “null”
- string 转换之后是字符串 string
- NaN 和 Infinity 转换之后是字符串 “null”
- 如果是函数类型
- 转换之后是 undefined
- 如果是对象类型(非函数)
- 如果有 toJSON()方法,那么序列化 toJSON()的返回值
- 如果是一个数组,如果属性值中出现了 undefined、任意的函数以及 symbol,转换成字符串”null”
- 如果是 RegExp 对象,返回{}(类型是 string)
- 如果是 Date 对象,返回 Date 的 toJSON 字符串值
- 如果是普通对象
- 如果属性值中出现了 undefined、任意的函数以及 symbol 值,忽略
- 所有以 symbol 为属性键的属性都会被完全会忽略掉
- 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误
if (!window.JSON) {window.JSON = {parse: function (sJSON) {return eval("(" + sJSON + ")");},stringify: (function () {var toString = Object.prototype.toString;var isArray =Array.isArray ||function (a) {return toString.call(a) === "[object Array]";};var escMap = {'"': '\\"',"\\": "\\\\","\b": "\\b","\f": "\\f","\n": "\\n","\r": "\\r","\t": "\\t",};var escFunc = function (m) {return (escMap[m] ||"\\u" + (m.charCodeAt(0) + 0x10000).toString(16).substr(1));};var escRE = /[\\"\u0000-\u001F\u2028\u2029]/g;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]") {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) + '"';};})(),};}
