// string -> string `"${string}"` // number -> `${number}` // bigInt -> throw new Error('Do not know how to serialize a BigInt at JSON.stringify'); // infinity -> null // -infinity-> null // boolean -> `${boolean}` // undefined -> undefined null // null -> null // symbol -> undefined // function -> undefined // date Fri Sep 10 2021 11:05:07 GMT+0800 (中国标准时间) -> `${date.toISOString()}` ""2021-09-10T03:04:48.870Z"" // regExp -> "{}" // error -> "{}" // array -> // object-> function isType(data, type) { const typeStr = Object.prototype.toString.call(data); const reg = /s([A-z]+)]/g; const matchs = reg.exec(typeStr); return matchs[1].toLowerCase() === type.toLowerCase(); } function stringify(data) { if(isType(data, "bigInt")) { // 报错的数据类型 throw new Error('Do not know how to serialize a BigInt at JSON.stringify'); } const nullTypes = ["undefined", "infinity", "-infinity", "null"] if(nullTypes.some(v => isType(data,v))) { // 返回null的数据类型 return "null" } if(data !== data) { return 'null'; } const undefinedTypes = [ "symbol", "function"] if(undefinedTypes.some(v => isType(data,v))) { // 返回undefined的数据类型 return "undefined" } const originalTypes = ["number", "boolean"] if(originalTypes.some(v => isType(data,v))) { // 返回原数据的数据类型 return `${data}` } if(isType(data, "string")) { // 处理 string return `"${data}"` } const emptyObjTypes = ["regexp", "error"] if(emptyObjTypes.some(v => isType(data,v))) { // 返回{}的数据类型 return `{}` } if(isType(data, "date")) { // 处理date return `${data.toISOString()}`; } if (Array.isArray(data)) { // 处理数组 const arr = data.map(v => stringify(v)); return `[${arr.join(",")}]` } if(isType(data,"object")) { // 处理对象 const arr = Object.entries(data).reduce((cur, [key, value]) => { if(value === undefined) { return cur}; cur.push(`"${key}":${stringify(value)}`); return cur; }, []) return `{${arr.join(",")}}`; } }