一、JSON.stringify方法的基本使用

  • 作用:将对象转换成JSON字符串的格式,配合JSON.parse可实现基础版的对象深拷贝
  • 语法:JSON.stringify(value[, replacer [, space]]) ```javascript let myObj1 = { name:’Tim’, age:10, friends:[1,2,3], sex:’boy’ }

// 第一个参数:必须,需要序列化的对象 let objToString1 = JSON.stringify(myObj1); console.log(objToString1); // {“name”:”Tim”,”age”:10,”friends”:[1,2,3],”sex”:”boy”}

// 第二个参数:需要对对象进行处理的函数 let objToString2 = JSON.stringify(myObj1 , function (key,value){ if (typeof value === ‘string’) return undefined; return value; }) console.log(objToString2); // {“age”:10,”friends”:[1,2,3]}

// 第三个参数:对象之间的空格数 let objToString3 = JSON.stringify(myObj1,null,’ ‘); console.log(objToString3); //{ // “name”: “Tim”, // “age”: 10, // “friends”: [ // 1, // 2, // 3 // ], // “sex”: “boy” // }

  1. <a name="TEEwO"></a>
  2. ## 二、JSON.stringify对各种数据类型的处理
  3. | JSON.stringify | 输入类型 | 输出 |
  4. | --- | --- | --- |
  5. | 基本数据类型 | string | 字符串格式 |
  6. | | number | 字符串格式的数值 |
  7. | | boolean | "true"/"false" |
  8. | | null | "null" |
  9. | | undefined / symbol | "undefined" |
  10. | | NAN / +-Infinity | "null" |
  11. | 引用数据类型(属性类型) | function | "undefined" |
  12. | | Date | Date的toJSON字符串 |
  13. | | RegExp | "{}" |
  14. | | 数组中出现了undefined、Symbol、Function | / |
  15. | | 普通的对象 | 1 - 如果对象有toJSON方法,则序列化toJSON方法的返回值<br />2 - 如果对象属性值为undefined,任意函数、Symbol,则忽略<br />3 - 如果以Symbol为属性键的属性都被忽略 |
  16. <a name="AM3VB"></a>
  17. ## 三、手写JSON.stringify方法
  18. ```javascript
  19. function jsonStringify(data){
  20. let type = typeof data;
  21. // 处理对基本数据类型的序列化
  22. if (type !== 'object'){
  23. let result = data;
  24. if (Number.isNaN(data) || data === Infinity){
  25. return "null";
  26. }
  27. if (type === "function" || type === "undefined" || type === "symbol"){
  28. return undefined;
  29. }
  30. // 字符串添加双引号是为了在对象递归调用时属性值添加引号
  31. if (type === "string"){
  32. return `"${data}"`;
  33. }
  34. return data;
  35. }else {
  36. // 对引用类型的处理
  37. // null 虽然是基本数据类型,但是 typeof null === ‘object’
  38. if (data === null){
  39. return "null";
  40. }
  41. // 处理 Date 的序列化
  42. if (data.toJSON && typeof data.toJSON === 'function'){
  43. return jsonStringify(data.toJSON())
  44. }
  45. // 处理RegExp的序列化
  46. if (data instanceof RegExp){
  47. return "{}"
  48. }
  49. // 处理数组的每一项,每一项的类型可能不同,在数组中,undefined,function、symbol类型序列化为null,递归调用
  50. if (data instanceof Array){
  51. let result = [];
  52. data.forEach((item,index)=>{
  53. if (typeof item === 'undefined' || typeof item === 'function' || typeof item === 'symbol') {
  54. result[index] = "null";
  55. } else {
  56. result[index] = jsonStringify(item);
  57. }
  58. });
  59. result = `[${result}]`;
  60. return result.replace(/'/g,'"');
  61. }
  62. // 处理普通对象,对于属性值为undefined、function、symbol及属性为symbol的项直接忽略掉
  63. let result = [];
  64. Object.keys(data).forEach((item,index) => {
  65. if (typeof item !== 'symbol'){
  66. if (data[item] !== undefined && typeof data[item] !== "function" && typeof data[item] !== 'symbol' ){
  67. result.push(`"${item}":${jsonStringify(data[item])}`)
  68. }
  69. }
  70. });
  71. return `{${result}}`.replace(/'/g,'"');
  72. }
  73. }
  74. let obj2 = {
  75. name:'myName',
  76. age:12,
  77. hasMarried:false,
  78. null:null,
  79. undefined:undefined,
  80. hobby:undefined,
  81. getName(){
  82. return this.name
  83. },
  84. date:new Date(),
  85. RegExp:new RegExp("a"),
  86. array1:[1,2,undefined,function (){},45],
  87. obj3:{
  88. name:'hello'
  89. }
  90. }
  91. // {"name":"myName","age":12,"hasMarried":false,"null":null,"date":"2021-07-21T09:41:18.270Z","RegExp":{}
  92. ,"array1":[1,2,null,null,45],"obj3":{"name":"hello"}}

四、JSON.stringify总结

JSON.stringify.png