精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

你會用JSON.stringify()?

開發 前端
JSON是一種輕量級數據格式,可以方便地表示復雜數據結構。本文著重介紹JSON.stringify()的使用方法和注意事項。

[[397374]]

前言

JSON是一種輕量級數據格式,可以方便地表示復雜數據結構。JSON對象有兩個方法:stringify()和parse()。在簡單的情況下,這兩個方法分別可以將JavaScript序列化為JSON字符串,以及將JSON解析為原生JavaScript值。

本文著重介紹JSON.stringify()的使用方法和注意事項。

一、使用方法

1、基本用法

JSON.stringify()可以把一個JavaScript對象序列化為一個JSON字符串。

  1. let json1 = { 
  2.   title: "Json.stringify"
  3.   author: [ 
  4.     "浪里行舟" 
  5.   ], 
  6.   year: 2021 
  7. }; 
  8. let jsonText = JSON.stringify(json1); 

默認情況下,JSON.stringify()會輸出不包含空格或縮進的JSON字符串,因此jsonText的值是這樣的:

  1. "{"title":"Json.stringify","author":["浪里行舟"],"year":2021}" 

在序列化JavaScript對象時,所有函數和原型成員都會有意地在結果中省略。此外,值為undefined的任何屬性也會被跳過。最終得到的就是所有實例屬性均為有效JSON數據類型的表示。

在JSON.stringify()方法一共能接受3個參數,其中兩個可選的參數(分別是第二、第三個參數)。這兩個可選參數可以用于指定其他序列化JavaScript對象的方式。第二個參數是過濾器,可以是數組或函數;第三個參數是用于縮進結果JSON字符串的選項。單獨或組合使用這些參數可以更好地控制JSON序列化。

2、第二個參數--過濾器

如果第二個參數是一個數組,那么JSON.stringify()返回的結果只會包含該數組中列出的對象屬性。比如下面的例子:

  1. let json1 = { 
  2.   title: "Json.stringify"
  3.   author: [ 
  4.     "浪里行舟" 
  5.   ], 
  6.   year: 2021, 
  7.   like'frontend'
  8.   weixin: 'frontJS' 
  9. }; 
  10. let jsonText = JSON.stringify(json1, ['weixin']); 

在這個例子中,JSON.stringify()方法的第二個參數是一個包含一個字符串的數組:"weixin"。它對應著要序列化的對象中的屬性,因此結果JSON字符串中只會包含這個屬性:

  1. "{"weixin":"frontJS"}" 

如果第二個參數是一個函數,則行為又有不同。提供的函數接收兩個參數:屬性名(key)和屬性值(value)。可以根據這個key決定要對相應屬性執行什么操作。這個key始終是字符串,只是在值不屬于某個鍵/值對時會是空字符串。

  1. const students = [ 
  2.   { 
  3.     name'james'
  4.     score: 100, 
  5.   }, { 
  6.     name'jordon'
  7.     score: 60, 
  8.   }, { 
  9.     name'kobe'
  10.     score: 90, 
  11.   } 
  12. ]; 
  13.  
  14. function replacer (key, value) { 
  15.   if (key === 'score') { 
  16.     if (value === 100) { 
  17.       return 'S'
  18.     } else if (value >= 90) { 
  19.       return 'A'
  20.     } else if (value >= 70) { 
  21.       return 'B'
  22.     } else if (value >= 50) { 
  23.       return 'C'
  24.     } else { 
  25.       return 'E'
  26.     } 
  27.   } 
  28.   return value; 
  29. console.log(JSON.stringify(students, replacer, 4)) 

上面的代碼,我們通過replacer將成績從百分制替換為成績等級。

 

值得注意的是,如果stringify的第二個參數為函數那么它的返回值如果是undefined,那么對應的屬性不會被序列化,如果返回其他的值,那么用返回的值替代原來的值進行序列化。

3、第三個參數--字符串縮進

JSON.stringify()方法的第三個參數控制縮進和空格。在這個參數是數值時,表示每一級縮進的空格數。例如,每級縮進4個空格,可以這樣:

  1. let json1 = { 
  2.   title: "Json.stringify"
  3.   author: [ 
  4.     "浪里行舟" 
  5.   ], 
  6.   year: 2021 
  7. }; 
  8. let jsonText = JSON.stringify(json1, null, 4); 

這樣得到的jsonText格式如下:

  1.     "title""Json.stringify"
  2.     "author": [ 
  3.         "浪里行舟" 
  4.     ], 
  5.     "year": 2021 

JSON.stringify()在處理數據的時候同時考慮了數據轉換和方便閱讀,只不過,方便閱讀這一點,常常被人忽略。

4、toJSON()方法--自定義JSON序列化

有時候,對象需要在JSON.stringify()之上自定義JSON序列化。此時,可以在要序列化的對象中添加toJSON()方法,序列化時會基于這個方法返回適當的JSON表示。

下面的對象為自定義序列化而添加了一個toJSON()方法:

  1. let json1 = { 
  2.   title: "Json.stringify"
  3.   author: [ 
  4.     "浪里行舟" 
  5.   ], 
  6.   year: 2021, 
  7.   like'frontend'
  8.   weixin: 'frontJS'
  9.   toJSON: function () { 
  10.     return this.author 
  11.   } 
  12. }; 
  13. console.log(JSON.stringify(json1)); // ["浪里行舟"

注意,箭頭函數不能用來定義toJSON()方法。主要原因是箭頭函數的詞法作用域是全局作用域,在這種情況下不合適。

二、使用場景

1、判斷數組是否包含某對象,或者判斷對象是否相等。

  1. //判斷數組是否包含某對象 
  2. let data = [ 
  3.     {name:'浪里行舟'}, 
  4.     {name:'前端工匠'}, 
  5.     {name:'前端開發'}, 
  6.     ], 
  7.     val = {name:'浪里行舟'}; 
  8. console.log(JSON.stringify(data).indexOf(JSON.stringify(val)) !== -1);//true 

我們還可以使用JSON.stringify()方法,來判斷兩個對象是否相等。

  1. // 判斷對象是否相等 
  2. let obj1 = { 
  3.     a: 1, 
  4.     b: 2 
  5.   } 
  6.   let obj2 = { 
  7.     a: 1, 
  8.     b: 2, 
  9.   } 
  10. console.log(JSON.stringify(obj1) === JSON.stringify(obj2)) // true 

不過這種方式存在著較大的局限性,對象如果調整了鍵的順序,就會判斷出錯!

  1. // 調整對象鍵的位置后 
  2. let obj1 = { 
  3.     a: 1, 
  4.     b: 2 
  5.   } 
  6.   let obj2 = { 
  7.     b: 2, 
  8.     a: 1, 
  9.   } 
  10. console.log(JSON.stringify(obj1) === JSON.stringify(obj2)) // false 

2、使用localStorage/sessionStorage時

localStorage/sessionStorage默認只能存儲字符串,而實際開發中,我們往往需要存儲對象類型,那么此時我們需要在存儲時利用json.stringify()將對象轉為字符串,在取本地緩存時,使用json.parse()轉回對象即可。

  1. // 存數據 
  2. function setLocalStorage(key,val) { 
  3.     window.localStorage.setItem(key, JSON.stringify(val)); 
  4. }; 
  5. // 取數據 
  6. function getLocalStorage(key) { 
  7.     let val = JSON.parse(window.localStorage.getItem(key)); 
  8.     return val; 
  9. }; 
  10. // 測試 
  11. setLocalStorage('Test',['前端工匠','浪里行舟']); 
  12. console.log(getLocalStorage('Test')); 

 

localStorage

3、實現對象深拷貝

開發中,有時候怕影響原數據,我們常深拷貝出一份數據做任意操作,使用JSON.stringify()與JSON.parse()來實現深拷貝是很不錯的選擇。

  1. let arr1 = [1, 3, { 
  2.     username: ' kobe' 
  3. }]; 
  4. let arr2 = JSON.parse(JSON.stringify(arr1)); 
  5. arr2[2].username = 'duncan';  
  6. console.log(arr1, arr2) 

 

image.png

這是利用JSON.stringify將對象轉成JSON字符串,再用JSON.parse把字符串解析成對象,一去一來,新的對象產生了,新對象會開辟新的棧,實現深拷貝。

這種方法雖然可以實現數組或對象深拷貝,但不能處理函數和正則,因為這兩者基于JSON.stringify和JSON.parse處理后,得到的正則就不再是正則(變為空對象),得到的函數就不再是函數(變為null)了。

  1. let arr1 = [1, 3, function () { }, { 
  2.   username: ' kobe' 
  3. }]; 
  4. let arr2 = JSON.parse(JSON.stringify(arr1)); 
  5. arr2[3].username = 'duncan'
  6. console.log(arr1, arr2) 

 

三、使用注意事項

JSON.stringify()雖然功能很強大,但是有些屬性無法被stringify,所以在開發中需注意以下幾種情況,以免產生一些始料未及的BUG。

1、被轉換值中有 NaN 和 Infinitylet my

  1. let myObj = { 
  2.   name"浪里行舟"
  3.   age: Infinity, 
  4.   money: NaN, 
  5. }; 
  6. console.log(JSON.stringify(myObj)); 
  7. // {"name":"浪里行舟","age":null,"money":null
  8.  
  9. JSON.stringify([NaN, Infinity]) 
  10. // [null,null

2、被轉換值中有 undefined、任意的函數以及 symbol 值

分為兩種情況:

數組,undefined、任意的函數以及symbol值在序列化的過程中會被轉換成 null

  1. JSON.stringify([undefined, function () { }, Symbol("")]); 
  2. // '[null,null,null]' 

非數組,undefined、任意的函數以及symbol值在序列化的過程中會被忽略

  1. JSON.stringify({ x: undefined, y: function () { }, z: Symbol("") }); 
  2. // '{}' 

3、循環引用

如果一個對象的屬性值通過某種間接的方式指回該對象本身,那么就是一個循環引用。比如:

  1. let bar = { 
  2.   a: { 
  3.     c: foo 
  4.   } 
  5. }; 
  6. let foo = { 
  7.   b: bar 
  8. }; 
  9.  
  10. JSON.stringify(foo) 

這種情況下,序列化會報錯的:

  1. // 錯誤信息 
  2. Uncaught ReferenceError: foo is not defined 
  3.     at <anonymous>:3:8 

4、含有不可枚舉的屬性值時

不可枚舉的屬性默認會被忽略:

  1. let personObj = Object.create(null, { 
  2.   name: { value: "浪里行舟", enumerable: false }, 
  3.   year: { value: "2021", enumerable: true }, 
  4. }) 
  5.  
  6. console.log(JSON.stringify(personObj)) // {"year":"2021"

四、總結

JSON.stringify()用于將JavaScript對象序列化為JSON字符串,這方法有一些選項可以用來改變默認的行為,以實現過濾或修改流程。不過也應該注意有些屬性是無法被 stringify,所以開發時候應該避開這些坑!

參考資料

  • JavaScript高級程序設計(第4版)
  • 慎用JSON.stringify
  • 你會用JS格式化JSON嗎?
  • json.stringify()的妙用
  • 你所不知道的JSON.stringify

 

責任編輯:姜華 來源: 前端工匠
相關推薦

2021-12-22 09:08:39

JSON.stringJavaScript字符串

2019-06-11 15:25:03

JSON性能前端

2021-12-11 18:59:35

JavascriptJSON應用

2022-12-05 14:50:53

2022-08-31 22:50:13

JavaScript函數JSON

2020-05-25 14:37:31

JSON.string前端秘密特性

2020-03-29 20:16:09

JavaScript前端技術

2024-03-25 00:10:00

JSON后端開發

2024-09-30 11:08:18

JSON局限性數據

2025-08-25 09:36:06

2025-04-21 10:43:21

2024-05-08 08:32:25

架構

2023-01-17 16:25:18

前端開發JSON

2022-03-10 09:11:33

JavaScrip開發JSON

2025-08-06 08:53:35

2023-05-12 08:11:58

JavaScriptJSON克隆

2023-05-08 09:00:46

JSON深拷貝對象

2022-04-28 21:53:52

TypeScriptany類型

2016-05-04 10:36:42

iossdwebimage開發

2021-08-11 10:00:51

緩存MyBatis管理
點贊
收藏

51CTO技術棧公眾號

久久精品丝袜高跟鞋| 久久国产精品久久久久| 欧美牲交a欧美牲交aⅴ免费真 | 国产精品va在线观看视色| 国产一区二区不卡在线 | 男人av资源站| 亚洲综合影院| 91极品视觉盛宴| a级黄色片网站| 亚洲区小说区图片区| 国产精品综合| 久久精品久久久久久| 国产草草浮力影院| 一区二区三区| 欧美日韩国产一中文字不卡| 亚洲一区二区三区免费看| 狠狠人妻久久久久久综合麻豆| 久久午夜精品| 欧美大片在线看免费观看| 国产肥白大熟妇bbbb视频| 年轻的保姆91精品| 色八戒一区二区三区| 国产精品一二三在线观看| 九一国产在线| 成人爱爱电影网址| 成人综合国产精品| 三级网站在线播放| 亚洲二区视频| 久久久99免费视频| 一色道久久88加勒比一| 精品嫩草影院| 91精品国产一区二区三区香蕉| 波多野结衣作品集| 欧美大胆a人体大胆做受| 亚洲男人天堂av网| 一级做a爰片久久| 久草视频在线看| 99久久久免费精品国产一区二区 | 国产精品三级一区二区| 99re在线视频| 久久久噜噜噜久久人人看| 国产精品一级久久久| av老司机久久| 久久精品国产第一区二区三区| 欧美亚洲在线观看| 三级黄色在线视频| 国产综合自拍| 久久成人一区二区| 日韩精品一区二区三区在线视频| 国产欧美日韩精品高清二区综合区| 亚洲成人免费在线视频| 久久久精品人妻一区二区三区| 久久中文字幕一区二区| 欧美日韩不卡一区二区| 午夜免费高清视频| 粉嫩一区二区三区| 91成人免费在线| 蜜臀av午夜一区二区三区| 亚洲同志男男gay1069网站| 午夜精品视频一区| 国产av天堂无码一区二区三区| a篇片在线观看网站| 亚洲精品国久久99热| 青少年xxxxx性开放hg| 麻豆视频在线观看免费网站| 亚洲人成网站在线| www插插插无码免费视频网站| 欧美草逼视频| 亚洲va欧美va人人爽| 日本在线xxx| 黑人巨大精品欧美一区二区桃花岛| 狠狠综合久久av一区二区小说| 欧洲黄色一级视频| 欧美日韩大片| 欧美午夜片在线看| 日本黄色的视频| 深夜福利一区| 亚洲国产精品高清久久久| 精品一区二区视频在线观看 | 精品久久免费看| 精品人妻在线视频| 香蕉国产成人午夜av影院| 亚洲欧美日韩国产中文专区| 精品无码国产污污污免费网站 | 国产高清亚洲一区| 国产麻豆乱码精品一区二区三区| 无码国产精品高潮久久99| 国产午夜精品一区二区三区嫩草 | 婷婷综合激情网| 26uuu国产在线精品一区二区| 性欧美videosex高清少妇| av电影在线观看网址| 亚洲色图另类专区| 日韩中文字幕在线视频观看| 日韩成人亚洲| 日韩欧美一区二区久久婷婷| 日本丰满少妇裸体自慰| 精品免费视频| 久久99久久99精品中文字幕| 国产美女激情视频| 精品制服美女丁香| 精品不卡在线| 1024国产在线| 精品久久中文字幕久久av| 中文字幕第80页| 试看120秒一区二区三区| 亚洲欧洲黄色网| 蜜臀久久精品久久久用户群体| 亚洲福利专区| 91精品国产综合久久久久久久久 | 久久狠狠亚洲综合| yellow视频在线观看一区二区 | 95精品视频在线| 一区二区av| 鲁鲁在线中文| 69堂精品视频| 欧美18—19性高清hd4k| 国产精品草草| 成人av电影天堂| 日本亚洲一区| 亚洲综合自拍偷拍| 182午夜在线观看| 婷婷精品在线观看| 欧美人交a欧美精品| 中文字幕日韩三级| 久久亚区不卡日本| 国产精品第157页| 激情中国色综合| 精品视频久久久| 久热这里只有精品在线| 久久成人免费电影| 青青草成人激情在线| 欧美xxxhd| 亚洲成人激情视频| 久久久久性色av无码一区二区| 美女在线观看视频一区二区| 久久资源亚洲| 国产高清中文字幕在线| 精品日韩av一区二区| 小泽玛利亚一区二区免费| 免费高清视频精品| 日本一区不卡| 日本美女久久| 亚洲人成毛片在线播放| 91av在线免费视频| 99精品热视频| 青草青青在线视频| 国产精品jk白丝蜜臀av小说 | 97人人在线视频| 精品精品国产高清一毛片一天堂| www色aa色aawww| 捆绑调教美女网站视频一区| 午夜精品一区二区在线观看的 | 成人国产精品久久久久久亚洲| 国产youjizz在线| 欧美性videos高清精品| 精品一区二区视频在线观看| 亚洲精选在线| 久久久久久久久一区| 日本不卡1234视频| 日韩av一区二区在线观看| 青青国产在线观看| wwww国产精品欧美| 91av在线免费播放| 欧美亚洲国产激情| 国产这里只有精品| av官网在线播放| 欧美成人a∨高清免费观看| 国产十六处破外女视频| 成人做爰69片免费看网站| 无码人妻少妇伦在线电影| 女人抽搐喷水高潮国产精品| 欧美在线播放视频| 国产高清免费在线播放| 欧美精品久久99久久在免费线 | 999精品色在线播放| 91亚洲国产精品| 天堂av中文在线| 亚洲激情第一页| 精品国产一区二区三区四| 国产日韩精品久久久| 国产成人美女视频| 亚洲午夜黄色| 日本一区视频在线| 精品视频在线观看网站| 国语自产精品视频在线看| 欧美一区二区视频| 欧美日韩在线播放一区| 免费中文字幕在线观看| 久久久久成人黄色影片| 亚洲免费黄色录像| 亚洲美女黄色| 偷拍视频一区二区| 欧美另类中文字幕| 51午夜精品视频| 日本三级视频在线观看| 欧美电视剧在线看免费| 无码人妻精品一区二| 亚洲精品视频一区| 一区二区伦理片| 国产精品一区二区在线播放| 欧美日韩激情视频在线观看| 欧美3p在线观看| 国产嫩草一区二区三区在线观看| 亚洲第一会所001| 欧美激情久久久| 91在线视频免费看| 日韩av一区在线观看| 国产又粗又猛又黄又爽无遮挡| 精品女厕一区二区三区| 黄色录像免费观看| 久久九九影视网| 亚洲一区和二区| 久久99精品一区二区三区| 男人操女人逼免费视频| 一本一道久久a久久精品蜜桃| 久久精品一二三区| 日韩精品一区国产| 国产欧美日韩中文| 日本免费久久| 国内精品久久久久| a级毛片免费观看在线| 亚洲网站视频福利| 无码国产伦一区二区三区视频| 91精品国产综合久久精品图片 | 丁香婷婷久久久综合精品国产 | 91在线免费看| 亚洲精品中文字幕有码专区| 国产情侣av在线| 欧美午夜寂寞影院| 欧美一区二区三区网站| 亚洲二区在线观看| 精品无码久久久久久久久| 亚洲天堂网中文字| 欧美福利在线视频| 中文成人av在线| 人妻视频一区二区| 久久久国产综合精品女国产盗摄| 水蜜桃av无码| 99re这里只有精品首页| 在线观看成人动漫| 丁香六月久久综合狠狠色| 久久久久久久久久久影视| 国产一区二区三区精品欧美日韩一区二区三区 | 国产99亚洲| 久久偷看各类wc女厕嘘嘘偷窃| 精品三级在线观看视频| 国产精品区二区三区日本| 69精品国产久热在线观看| 97自拍视频| 91精品导航| 国产精品一区二区三区精品| 9l视频自拍九色9l视频成人| 91成人免费视频| japanese色系久久精品| 国产乱人伦精品一区二区| 国产精品超碰| 久久av一区二区三区漫画| 欧美一区二区三区红桃小说| 久久久久一区二区三区| 日韩av不卡一区| 欧美在线播放一区| 精品国产1区| 一区二区三区精品国产| 综合视频在线| av免费观看大全| 亚洲视频1区| 免费男同深夜夜行网站| 男人操女人的视频在线观看欧美| 最新av免费在线观看| 国产精选一区二区三区| 国产伦精品一区二区三区88av| 不卡区在线中文字幕| 美女久久久久久久久久| 中文字幕av在线一区二区三区| 久久爱一区二区| 玉米视频成人免费看| 日本亚洲欧美在线| 色噜噜狠狠成人中文综合| 一区二区视频免费观看| 日韩久久免费av| 日韩电影免费| 色综合影院在线| 久久国产精品黑丝| 庆余年2免费日韩剧观看大牛| 日本亚洲欧洲无免费码在线| 91精品国产综合久久久久久丝袜| 99re8这里有精品热视频8在线| 欧美精品成人一区二区在线观看 | 亚洲少妇激情视频| 拍真实国产伦偷精品| 色综合久久88| 日韩大片欧美大片| 96成人在线视频| 亚洲欧美tv| 欧洲精品视频在线| 欧美亚洲网站| 真实乱偷全部视频| 国产亚洲精品bt天堂精选| 97成人资源站| 日韩欧美国产成人| www.色视频| 国产午夜精品视频| 黄色在线观看视频网站| 国产精品视频在线观看| 黑人久久a级毛片免费观看| 亚洲欧洲一区二区在线观看| 亚洲免费大片| 性色av浪潮av| 国产欧美视频在线观看| 国产污视频在线观看| 欧美年轻男男videosbes| 午夜福利一区二区三区| 美女精品久久久| 香蕉成人影院| 欧美精品欧美精品| 亚洲小说欧美另类婷婷| 欧美视频亚洲图片| 国产精品嫩草影院av蜜臀| av资源免费观看| 日韩精品一区二区三区蜜臀| 五月天婷婷在线视频| 奇米影视亚洲狠狠色| 波多野结衣一区二区三区免费视频| 亚州欧美一区三区三区在线| 亚洲欧美日韩专区| 久久久久99人妻一区二区三区| 日韩美女视频一区二区| 手机av免费观看| 亚洲精品不卡在线| 四虎影院观看视频在线观看| 国产免费成人av| 精品国产一区二区三区噜噜噜| 黄页网站大全在线观看| 国产成人自拍在线| 免费又黄又爽又色的视频| 日韩一本二本av| 免费**毛片在线| 国产视频999| 日韩欧美自拍| 色综合色综合色综合色综合| 国产日韩精品一区| 在线观看亚洲黄色| 国产小视频国产精品| 免费观看亚洲| 欧美亚洲国产免费| 老司机精品导航| 69视频在线观看免费| 欧美性生活大片视频| www.久久热.com| 国产在线精品成人一区二区三区| 日本久久精品| 超碰超碰在线观看| 一色桃子久久精品亚洲| 国产精品怡红院| 久久99热精品这里久久精品| 一区二区在线免费播放| 婷婷无套内射影院| 99精品在线观看视频| 亚洲欧美一区二区三区在线观看| 亚洲剧情一区二区| 成人做爰视频www网站小优视频| 青青成人在线| 日本不卡一区二区三区| 日韩av片在线免费观看| 在线播放日韩导航| 超碰在线caoporen| 91视频婷婷| 夜久久久久久| 国产精成人品免费观看| 欧美日韩一区二区在线视频| 国产黄网站在线观看| 国产福利久久精品| 久久精品日产第一区二区| 精品丰满少妇一区二区三区| 9191成人精品久久| 久草在线视频福利| 欧美三级华人主播| 久久99九九99精品| 国产小视频在线看| 亚洲欧美国产视频| 成人在线啊v| 国产freexxxx性播放麻豆| 99精品欧美一区二区三区综合在线| 少妇一级淫片日本| 欧美成人在线影院| 日韩福利视频一区| 欧美大尺度做爰床戏| 亚洲影视在线播放| 国产免费永久在线观看| 91久久精品一区二区别| 亚洲永久免费| 熟女少妇a性色生活片毛片| 亚洲国产成人一区| 亚洲电影有码| 国产青草视频在线观看| 国产欧美一区二区精品性色 | 国产综合久久久久久鬼色| 狠狠躁夜夜躁人人爽天天高潮| 色综久久综合桃花网|