我的回答

字符串不处理
数字变成字符串
布尔值转字符串
函数直接剔除
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 为属性键的属性都会被完全会忽略掉
  • 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误
  1. if (!window.JSON) {
  2. window.JSON = {
  3. parse: function (sJSON) {
  4. return eval("(" + sJSON + ")");
  5. },
  6. stringify: (function () {
  7. var toString = Object.prototype.toString;
  8. var isArray =
  9. Array.isArray ||
  10. function (a) {
  11. return toString.call(a) === "[object Array]";
  12. };
  13. var escMap = {
  14. '"': '\\"',
  15. "\\": "\\\\",
  16. "\b": "\\b",
  17. "\f": "\\f",
  18. "\n": "\\n",
  19. "\r": "\\r",
  20. "\t": "\\t",
  21. };
  22. var escFunc = function (m) {
  23. return (
  24. escMap[m] ||
  25. "\\u" + (m.charCodeAt(0) + 0x10000).toString(16).substr(1)
  26. );
  27. };
  28. var escRE = /[\\"\u0000-\u001F\u2028\u2029]/g;
  29. return function stringify(value) {
  30. if (value == null) {
  31. return "null";
  32. } else if (typeof value === "number") {
  33. return isFinite(value) ? value.toString() : "null";
  34. } else if (typeof value === "boolean") {
  35. return value.toString();
  36. } else if (typeof value === "object") {
  37. if (typeof value.toJSON === "function") {
  38. return stringify(value.toJSON());
  39. } else if (isArray(value)) {
  40. var res = "[";
  41. for (var i = 0; i < value.length; i++)
  42. res += (i ? ", " : "") + stringify(value[i]);
  43. return res + "]";
  44. } else if (toString.call(value) === "[object Object]") {
  45. var tmp = [];
  46. for (var k in value) {
  47. if (value.hasOwnProperty(k))
  48. tmp.push(stringify(k) + ": " + stringify(value[k]));
  49. }
  50. return "{" + tmp.join(", ") + "}";
  51. }
  52. }
  53. return '"' + value.toString().replace(escRE, escFunc) + '"';
  54. };
  55. })(),
  56. };
  57. }