成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Javascript的JSON.stringify()知多少?

開發 前端
本篇文章就將詳細談談JSON.stringify,并將帶著你進行自己手寫一個JSON.stringify,站在全局考察自己對于各種數據類型理解的深度,和各種極端的邊界情況的處理能力。

[[439898]]

1寫在前面

前幾天看到前端胖頭魚的一篇文章《就因為JSON.stringify,我的年終獎差點打水漂了》,講的就是JSON.stringify在工程開發中的應用,線上用戶不能提交表單。因為字段中經過JSON.stringify后的字符串對象缺少value key,導致后端parse之后無法正確讀取value值,進而報接口系統異常,用戶無法進行下一步動作。本篇文章就將詳細談談JSON.stringify,并將帶著你進行自己手寫一個JSON.stringify,站在全局考察自己對于各種數據類型理解的深度,和各種極端的邊界情況的處理能力。

2JSON.stringify()

JSON.stringify是日常開發中經常用到的JSON對象中的一個方法,用于將一個 JavaScript 對象或值轉換為 JSON 字符串,如果指定了一個 replacer 函數,則可以選擇性地替換值,或者指定的 replacer 是數組,則可選擇性地僅包含數組指定的屬性。

簡而言之,就是用于將對象轉換成JSON字符串。

  1. JSON.stringify(value[, replacer [, space]]) 
  • value:必填參數,需要序列化的JSON對象。
  • replacer:可選參數。
    • 函數類型:則在序列化過程中,被序列化的值的每個屬性都會經過該函數的轉換和處理;
    • 數組類型:則只有包含在這個數組中的屬性名才會被序列化到最終的 JSON 字符串中;
    • null或未提供:則對象所有的屬性都會被序列化。
  • space:可選參數,用來控制字符串之間的間距。
  • 指定縮進用的空白字符串,用于美化輸出(pretty-print);
  • 數字類型,它代表有多少的空格;上限為10。小于1,意味著沒有空格;
  • 字符串類型,當字符串長度超過10個字母,取其前10個字母,該字符串將被作為空格;
  • null或未提供,將沒有空格。

注意:

  • 循環引用的對象(對象之間相互引用,形成無限循環)執行此方法,會拋出錯誤。
  • 布爾值、數字、字符串的包裝對象在序列化過程中會自動轉換成對應的原始值。
  • undefined、任意的函數以及symbol值,在序列化過程中會被忽略(出現在非數組對象的屬性值中時)或者被轉換成 null(出現在數組中時)。函數、undefined被單獨轉換時,會返回 undefined,如JSON.stringify(function(){}) or JSON.stringify(undefined)。這就是為什么對象中有這些類型的屬性,不能使用JSON.parse(JSON.stringify())來進行深拷貝。
  • Date 日期調用了 toJSON() 將其轉換為了 string 字符串(同Date.toISOString()),因此會被當做字符串處理。
  • NaN 和 Infinity 格式的數值及 null 都會被當做 null。
  • 其他類型的對象,包括 Map/Set/WeakMap/WeakSet,僅會序列化可枚舉的屬性。
  1. const user = {name:"yichuan",age:18,university:"SCU"}; 
  2. //1.序列化對象 
  3. console.log(JSON.stringify(user));//'{"name":"yichuan","age":18,"university":"SCU"}' 
  4.  
  5. //2.序列化基礎數據類型 
  6. console.log(JSON.stringify("平"));//"平" 
  7. console.log(JSON.stringify(18));//"18" 
  8. console.log(JSON.stringify(true));//"true" 
  9. console.log(JSON.stringify(null));//"null" 
  10. console.log(JSON.stringify(undefined));//undefined 
  11.  
  12. //3.使用replacer函數 
  13. console.log(JSON.stringify(user,function(key,value){ 
  14.    return typeof value === "number" ? 666 : "sixsixsix"
  15. }));//'{name:"sixsixsix",age:666,university:"sixsixsix"}' 
  16.  
  17. //4.指定數組 
  18. console.log(JSON.stringify(user,["name"]));//'{"name":"yichuan"}' 
  19.  
  20. //5.指定字符串間的間距 
  21. console.log(JSON.stringify(user,null,2)); 
  22. /* 
  23.   "name""yichuan"
  24.   "age": 18, 
  25.   "university""SCU" 
  26. */ 
  27.  
  28. //6.指定字符串的間距”*“ 
  29. console.log(JSON.stringify(user,null,"*****")); 
  30. /* 
  31. *****"name""yichuan"
  32. *****"age": 18, 
  33. *****"university""SCU" 
  34. */ 

整理歸納:

JSON.stringify 輸入 輸出
基礎數據類型 string string
  number 字符串類型的字符串
  boolean "true"/"false"
  undefined undefined
  null "null"
  NaN和Infinity "null"
  symbol undefined
  BigInt 報錯
引用數據類型 function undefined
  Array數組中出現了function、undefined、symbol string/"null"

| | | regExp | "{}" | | | Date | Date的toJSON()字符串 | | | 普通object |

  • 如果有toJSON()方法,那么序列化toJSON()的返回值
  • 如果屬性值中出現了function、undefined、symbol則忽略
  • 所有以symbol為屬性鍵的屬性都會被完全忽略掉 |

3手撕JSON.stringify()

其實現場手撕代碼還是有點麻煩的,需要考慮到對各種類型的數據進行處理,考慮各種邊界情況。

  1. function stringify(data){ 
  2.  const type = typeof data; 
  3.   //可能為基礎數據類型的處理 
  4.   if(type !== "object"){ 
  5.    //判斷是否為NaN或Infinity或者null 
  6.     if(Number.isNaN(data)||data===Infinity){ 
  7.      return "null"
  8.     } 
  9.     //判斷可能為function、undefined、symbol類型 
  10.     if(type === "function" || type === "undefined" || type === "symbol" ){ 
  11.      return undefined 
  12.     } 
  13.     //判斷字符串或數值的處理 
  14.     if(type === "string" || type === "number"){ 
  15.      return `"${data}"
  16.     } 
  17.     if (typeof data === 'bigint') { 
  18.       throw new TypeError('Do not know how to serialize a BigInt'
  19.     } 
  20.     if (isCyclic(data)) { 
  21.       throw new TypeError('Converting circular structure to JSON'
  22.     } 
  23.     return String(data); 
  24.   }else
  25.    //null 
  26.     if(type==="null"){ 
  27.      return "null" 
  28.     }else if(data.toJSON && typeof data.toJSON === "function"){ 
  29.       //遞歸 
  30.      return stringify(data.toJSON); 
  31.     }else if(Array.isArray(data)){ 
  32.      const arr = []; 
  33.       //對于數組類型有很多種情況 
  34.       data.forEach((item,index)=>{ 
  35.        //判斷可能為function、undefined、symbol類型 
  36.         if(type === "function" || type === "undefined" || type === "symbol" ){ 
  37.           arr[index] = "null" 
  38.         }else
  39.           arr[index] = stringify(item); 
  40.         } 
  41.       }); 
  42.       result = `"${arr}"`; 
  43.       return arr.result.replace(/'/g,""); 
  44.     }else
  45.      //普通對象 
  46.       const arr = []; 
  47.       //遍歷對象 
  48.       Object.keys(data).forEach((key)=>{ 
  49.        //key如果是symbol類型,忽略 
  50.         if(data[key]!=="symbol"){ 
  51.           if(typeof data[key]!=="undefined" && typeof data[key]!=="function" && typeof data[key]!=="symbol"){ 
  52.             arr.push(`"${key}":stringify(data[key])`); 
  53.           } 
  54.         } 
  55.          
  56.       }) 
  57.       return `{${arr}}`.replace(/'/g, '"') 
  58.     } 
  59.   } 

4參考文章

《MDN:JSON.stringify()》

《就因為JSON.stringify,我的年終獎差點打水漂了》

5寫在最后

 

我們平時開發中將JSON.stringify應用最多的可能就是淺層的對象進行深拷貝,也就是進行序列化處理。但是當我們進行手撕代碼的時候,需要考慮各種邊界情況,這對于我們來說就比較麻煩,作為面試也是對數據類型的全面考察。

 

責任編輯:武曉燕 來源: 前端萬有引力
相關推薦

2021-05-06 05:30:33

JSONstringify()parse()

2019-06-11 15:25:03

JSON性能前端

2022-12-05 14:50:53

2020-03-29 20:16:09

JavaScript前端技術

2020-05-25 14:37:31

JSON.string前端秘密特性

2021-12-22 09:08:39

JSON.stringJavaScript字符串

2024-09-30 11:08:18

JSON局限性數據

2022-08-31 22:50:13

JavaScript函數JSON

2021-12-04 11:17:32

Javascript繼承編程

2021-12-10 07:47:30

Javascript異步編程

2021-12-03 15:24:45

Javascript數據類型

2024-03-25 00:10:00

JSON后端開發

2021-12-07 08:01:33

Javascript 垃圾回收機制前端

2021-12-05 08:27:56

Javascript 高階函數前端

2025-04-21 10:43:21

2021-12-06 07:15:48

Javascript作用域閉包

2012-02-13 22:50:59

集群高可用

2024-08-06 10:07:15

2022-05-08 18:02:11

tunnel隧道云原生

2021-09-26 06:43:08

快閃前端文件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人免费网站视频 | 人人看人人干 | 精品国产18久久久久久二百 | 精品一区在线看 | 亚州精品天堂中文字幕 | 国产美女在线免费观看 | 日本午夜免费福利视频 | 国产区第一页 | 狠狠干av| 9999视频 | 亚洲综合色视频在线观看 | 国产探花在线精品一区二区 | 91精品国产色综合久久 | 午夜小电影 | 97福利在线 | 成人福利在线观看 | 午夜精品福利视频 | 日韩精品一区二区三区中文字幕 | 久草视频在线播放 | 国产欧美日韩二区 | 日日天天| 欧美一级淫片免费视频黄 | 亚洲看片网站 | 91免费视频| 在线观看亚洲欧美 | 欧美区在线| 亚洲人成在线播放 | 亚洲美女一区 | 欧美jizzhd精品欧美巨大免费 | 国产乱码精品一区二区三区中文 | 亚洲啊v | 欧美日韩国产在线 | 欧美精品二区 | 国产高清精品一区二区三区 | 久久中文一区二区 | 久久精彩视频 | 国产精品一区二区三级 | 午夜a级理论片915影院 | 欧美一区二区三区久久精品 | 国产精品福利网站 | 欧美性一区二区三区 |