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

你不知道的 JSON.stringify!!!

開發 前端
JSON.stringify是我們經常用到的的一個方法,它主要作用是將 JavaScript 值和對象轉換為字符串。

[[441493]]

JSON.stringify是我們經常用到的的一個方法,它主要作用是將 JavaScript 值和對象轉換為字符串。如:

  1. JSON.stringify({ foo: "bar" }); 
  2. // => '{"foo":"bar"}' 
  3.  
  4. JSON.stringify(123); 
  5. // => '123' 

但是JS 的許多地方都有問題,這個函數也不例外。我們可能會想象一個叫做 "stringify "的函數總是返回一個字符串......但它并沒有!

例如,如果你嘗試 stringify undefined,它返回 undefined ,而不是一個字符串。

  1. JSON.stringify(undefined); 
  2. // => undefined 

接下來,我將分兩部分講:

  • 列舉 JSON.stringify 不返回字符串的情況
  • 我們將如何避免這些陷阱

什么時候 JSON.stringify 不返回字符串?

undefined、任意的函數以及 symbol 值,在序列化過程中會被忽略(出現在非數組對象的屬性值中時)或者被轉換成 null(出現在數組中時)。函數、undefined 被單獨轉換時,會返回 undefined。

對包含循環引用的對象(對象之間相互引用,形成無限循環)執行此方法,會拋出錯誤

我認為 JSON.stringify 能夠返回字符串以外的東西是挺驚訝的。但在6種情況下,它可以返回undefined:

試圖在頂層對 undefined 進行序列化,會返回 undefined。

  1. JSON.stringify(undefined); 
  2. // => undefined 

嘗試序列化函數也會返回 undefined。對于常規函數、箭頭函數、異步函數和生成器函數都是如此。

  1. JSON.stringify(function foo() {}); 
  2. // => undefined 
  3.  
  4. JSON.stringify(() => {}); 
  5. // => undefined 
  6.  
  7. function bar() {} 
  8. bar.someProperty = 123; 
  9. JSON.stringify(bar); 
  10. // => undefined 

嘗試序列化symbol 也會返回 undefined。

  1. JSON.stringify(Symbol("computers were a mistake")); 
  2. // => undefined 

在瀏覽器中,試圖序列化被廢棄的document.all 也會返回 undefined。

  1. // => undefined 

這只影響到瀏覽器,因為document.all在其他環境中是不可用的,比如Node。

帶有 toJSON 函數的對象將被運行,而不是試圖正常地序列化它們。但是如果 toJSON 返回上面的一個值,試圖在頂層序列化它將導致 JSON.stringify 返回undefined。

  1. JSON.stringify({ toJSON: () => undefined }); 
  2. // => undefined 
  3.  
  4. JSON.stringify({ ignored: true, toJSON: () => undefined }); 
  5. // => undefined 
  6.  
  7. JSON.stringify({ toJSON: () => Symbol("heya") }); 
  8. // => undefined 

你可以傳遞第二個參數,稱為 "replacer",它可以改變序列化的邏輯。如果這個函數為頂層返回上述值之一,JSON.stringify 將返回undefined。

  1. JSON.stringify({ ignored: true }, () => undefined); 
  2. // => undefined 
  3.  
  4. JSON.stringify(["ignored"], () => Symbol("hello")); 
  5. // => undefined 

需要注意的是,其中的許多東西實際上只影響到頂層的序列化。例如,JSON.stringify({foo: undefined}),返回字符串"{}",這并不令人驚訝。

我還想提一下,TypeScript的類型定義在這里是不正確的。例如,下面的代碼類型的校驗可以通過:

  1. const result: string = JSON.stringify(undefined); 

在第2部分中,我們將討論如何更新 TypeScript 的定義以確保其正確性。

JSON.stringify 也可能遇到問題,導致它拋出一個錯誤。在正常情況下,有四種情況會發生:

循環引用會導致拋出一個類型錯誤。

  1. const b = { a }; 
  2. a.b = b; 
  3.  
  4. JSON.stringify(a); 
  5. // => TypeError: cyclic object value 

注意,這些錯誤消息在不同瀏覽器可能提示是不樣的,例如,Firefox 的錯誤信息與Chrome的不同。

BigInts不能用JSON.stringify 進行序列化,這些也會導致一個TypeError。

  1. JSON.stringify(12345678987654321n); 
  2. // => TypeError: BigInt value can't be serialized in JSON 
  3.  
  4. JSON.stringify({ foo: 456n }); 
  5. // => TypeError: BigInt value can't be serialized in JSON 

帶有 toJSON 函數的對象將被運行。如果這些函數拋出錯誤,它將冒泡到調用者。

  1. const obj = { 
  2.   foo: "ignored"
  3.   toJSON() { 
  4.     throw new Error("Oh no!"); 
  5.   }, 
  6. }; 
  7.  
  8. JSON.stringify(obj); 
  9. // => Error: Oh no

你可以傳遞第二個參數,稱為 replacer。如果這個函數拋出一個錯誤,它將冒泡。

  1. JSON.stringify({}, () => { 
  2.   throw new Error("Uh oh!"); 
  3. }); 
  4. // => Error: Uh oh! 

現在我們已經看到了 JSON.stringify 不返回字符串的情況,接下來,我們來看看如何避免這些問題。

如何避免這些問題

沒有關于如何解決這些缺陷的通用方法,所以這里只介紹一些常見的情況。

處理循環引用

根據個人經驗,JSON.stringify 在傳遞循環引用時最容易出錯。如果這對你來說是一個常見的問題,我推薦 json-stringify-safe 包,它能很好地處理這種情況。

  1. const stringifySafe = require("json-stringify-safe"); 
  2.  
  3. const a = {}; 
  4. const b = { a }; 
  5. a.b = b; 
  6.  
  7. JSON.stringify(a); 
  8. // => TypeError: cyclic object value 
  9.  
  10. stringifySafe(a); 
  11. // => '{"b":{"a":"[Circular ~]"}}' 

封裝

你可能想用你自己的自定義函數來封裝 JSON.stringify。你可以決定你想要它做什么。錯誤應該冒出來嗎?如果 JSON.stringify 返回 undefined,應該怎么做?

例如,Signal Desktop有一個名為 reallyJsonStringify 的函數,它總是返回一個用于調試的字符串。就像這樣

  1. function reallyJsonStringify(value) { 
  2.   let result; 
  3.   try { 
  4.     result = JSON.stringify(value); 
  5.   } catch (_err) { 
  6.     // If there's any error, treat it like `undefined`. 
  7.     result = undefined; 
  8.   } 
  9.  
  10.   if (typeof result === "string") { 
  11.     // It's a string, so we're good. 
  12.     return result; 
  13.   } else { 
  14.     // Convert it to a string. 
  15.     return Object.prototype.toString.call(value); 
  16.   } 

關于TypeScript類型的說明

如果你已經在用 TypeScript,可能會驚訝地發現,TypeScript對 JSON.stringify的官方定義在這里并不正確。它們實際上看起來像這樣:

  1. // Note: 這里面簡化過 
  2. interface JSON { 
  3.   // ... 
  4.   stringify(value: any): string; 

不幸的是,這是一個長期存在的問題,沒有一個完美的解決方案。

你可以嘗試修補 JSON.stringify 的類型,但每個解決方案都有一定的缺點。我建議用自定義類型定義自己的包裝器并。例如,Signal Desktop的reallyJsonStringify 的模板:

  1. function reallyJsonStringify(value: unknown): string { 
  2.   // ... 

總結

  • JSON.stringify 有時會返回 undefined,而不是一個字符串
  • JSON.stringify 有時會拋出一個錯誤
  • 我們可以通過用不同的方式包裝函數來解決這個問題

希望這篇文章能讓你對 JSON.stringify 有更全面的了解。

作者:BlackLivesMatter 譯者:前端小智

來源:devinduct 原文:https://evanhahn.com/when-stringify-doesnt-return-a-string

 

責任編輯:姜華 來源: 大遷世界
相關推薦

2024-03-25 00:10:00

JSON后端開發

2021-05-06 05:30:33

JSONstringify()parse()

2023-01-17 16:25:18

前端開發JSON

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2019-06-11 15:25:03

JSON性能前端

2021-12-11 18:59:35

JavascriptJSON應用

2009-12-10 09:37:43

2022-10-13 11:48:37

Web共享機制操作系統

2021-02-01 23:23:39

FiddlerCharlesWeb

2011-09-15 17:10:41

2010-08-23 09:56:09

Java性能監控

2022-12-05 14:50:53

2020-05-25 14:37:31

JSON.string前端秘密特性

2020-03-29 20:16:09

JavaScript前端技術

2022-11-04 08:19:18

gRPC框架項目

2020-09-15 08:35:57

TypeScript JavaScript類型

2021-10-17 13:10:56

函數TypeScript泛型

2021-12-29 11:38:59

JS前端沙箱

2015-06-19 13:54:49

點贊
收藏

51CTO技術棧公眾號

99精品网站| 制服诱惑亚洲| 99视频有精品| 51色欧美片视频在线观看| 中文字幕乱码一区| 欧美粗大gay| 国产精品色哟哟| 99视频免费观看| 西西44rtwww国产精品| 国产麻豆精品久久| 欧美一区日韩一区| av之家在线观看| 九色视频成人自拍| 精品无人区卡一卡二卡三乱码免费卡 | 竹菊久久久久久久| 色综合久久久久久久久| 在线视频不卡国产| 天堂在线视频网站| 欧美精品麻豆| 精品一区二区三区四区| 五月婷婷之婷婷| 国产黄色大片在线观看| 国产欧美视频在线观看| 波多野结衣一区二区三区在线观看| 国产成人免费观看视频 | 国产国语性生话播放| 日韩av免费| 亚洲一区二区三区美女| 欧美一区二区三区四区夜夜大片| 国产精品久久免费| 美女久久网站| 欧美黄色小视频| 亚洲一级片在线播放| 成人在线超碰| 欧美日韩国产高清一区| 国产精品333| 黄网页免费在线观看| 久久综合狠狠综合久久综合88| 91精品久久久久久久久久久久久久 | 制服丝袜第一页在线观看| 精品裸体bbb| 偷拍日韩校园综合在线| 大桥未久一区二区| 91.xxx.高清在线| 久久伊99综合婷婷久久伊| 3d动漫精品啪啪一区二区三区免费 | 国产模特精品视频久久久久| 久久综合久久88| 三上悠亚影音先锋| 麻豆成人入口| 日韩精品在线一区二区| 激情文学亚洲色图| 日韩成人免费av| 日本精品一区二区三区四区的功能| 国产日韩亚洲欧美在线| 91网在线看| **欧美大码日韩| 五月天久久狠狠| 青青草在线视频免费观看| av一区二区三区| 成人9ⅰ免费影视网站| 99国产在线播放| 国精品**一区二区三区在线蜜桃| 国产精品久久久久久久久久尿| 青青青国产在线 | 伊人久久视频| 天天射综合影视| 99在线精品免费视频| 超免费在线视频| 亚洲午夜影视影院在线观看| 欧美做暖暖视频| 精灵使的剑舞无删减版在线观看| 亚洲欧美日韩一区二区 | 国产成人aa在线观看网站站| 欧美精品粉嫩高潮一区二区| 日韩爱爱小视频| 久久爱.com| 欧美日韩黄色一区二区| 中文字幕第17页| 不卡一区视频| 欧美videofree性高清杂交| 国内精品免费视频| 欧美黑人巨大videos精品| 亚洲国产天堂久久综合网| 天堂久久久久久| 国产成人三级| 日韩中文理论片| 国产极品国产极品| 亚洲国产日韩欧美一区二区三区| 午夜精品一区二区三区在线视| 中文字幕亚洲精品在线| 三级影片在线观看欧美日韩一区二区| 国产精品扒开腿做爽爽爽的视频| 中文字幕在线一| 国产高清精品网站| 蜜桃av噜噜一区二区三区| 福利视频在线播放| 亚洲日本在线观看| av高清在线免费观看| 日韩国产网站| 91精品国产高清一区二区三区蜜臀| 精品国产免费久久久久久婷婷| 久久精品福利| 一区二区三区视频免费| 好吊色视频在线观看| 国产精品日本| 国产一区二区香蕉| 凸凹人妻人人澡人人添| 欧美国产激情二区三区 | www日本在线观看| 色愁久久久久久| 中文字幕亚洲自拍| 精品午夜福利视频| 日韩av不卡一区二区| 999视频在线免费观看| 男女视频在线观看| 尤物视频一区二区| 手机看片福利日韩| 99a精品视频在线观看| 亚洲区免费影片| 九九热精彩视频| 日本在线播放一区二区三区| 国产精品二区在线| 日日夜夜精品一区| 日韩欧美成人免费视频| 丰满少妇一区二区三区专区| 精品国产91久久久久久浪潮蜜月| 久久99热精品| 中文字幕一区二区三区人妻四季| 成人高清视频在线| 色撸撸在线观看| 九九热线视频只有这里最精品| 日韩一区二区电影在线| 又色又爽的视频| 香蕉久久国产| 国产精品一区二区三区免费| 青青青青在线| 91传媒视频在线播放| 国产草草浮力影院| 欧美日本久久| 91久久久久久久久久| www.亚洲.com| 午夜精品免费在线观看| 伊人av在线播放| 天天综合亚洲| 成人黄色片在线| 在线播放毛片| 欧美在线你懂得| 亚洲一区二区观看| 在线视频免费在线观看一区二区| 成人亲热视频网站| 男女啪啪在线观看| 欧美日韩亚洲综合在线| 欧美成人另类视频| 日韩中文字幕亚洲一区二区va在线| 国产丝袜不卡| heyzo高清在线| 欧美岛国在线观看| 激情五月婷婷在线| 国产成人在线免费| 日本黄大片在线观看| 亚洲日本一区二区三区在线| 欧美成人全部免费| 亚洲精品成人区在线观看| 亚洲精品免费看| 欧美熟妇另类久久久久久多毛| 影音先锋日韩精品| 99在线视频播放| 女囚岛在线观看| 亚洲国产精品推荐| 中文字幕第15页| 26uuu欧美| 白嫩少妇丰满一区二区| 欧美丝袜激情| 成人国产精品色哟哟| a视频在线观看免费| 欧美岛国在线观看| 久久久久久久久影院| 久久久久久久久久久久久女国产乱 | 人妻无码中文字幕| 无吗不卡中文字幕| 天天躁夜夜躁狠狠是什么心态| 日韩高清在线电影| 亚洲图片都市激情| 国产精一区二区| 久久久久久久97| 日本天堂在线| 欧美日韩dvd在线观看| 婷婷在线精品视频| gogogo免费视频观看亚洲一| 人妻熟女一二三区夜夜爱| 成人激情视频| 99精品欧美一区二区三区| jizzjizz中国精品麻豆| 亚洲色图欧美制服丝袜另类第一页| 高潮无码精品色欲av午夜福利| 亚洲色图一区二区三区| www国产视频| 日韩国产成人精品| 国产精品三级一区二区| 亚洲人亚洲人色久| 国产欧洲精品视频| caoporn视频在线| 夜夜嗨av一区二区三区免费区 | 亚洲成人免费观看| 中文字幕人妻一区二区三区在线视频| 国产综合久久久久影院| 日韩少妇内射免费播放18禁裸乳| 欧美日韩性在线观看| 99一区二区三区| 日韩免费小视频| 欧美伦理91i| 国产乱理伦片a级在线观看| 欧美一区二区三区在线观看| 亚洲天堂一区在线观看| 亚洲桃色在线一区| 日韩精品无码一区二区三区久久久| 国产在线精品一区在线观看麻豆| 久久综合色视频| 一区二区三区毛片免费| 欧美中文娱乐网| 伊人www22综合色| 国产精品一二三视频| 夜鲁夜鲁夜鲁视频在线播放| 欧美精品手机在线| 色综合久久影院| 亚洲女人被黑人巨大进入al| 精品国产乱码久久久久久蜜臀网站| 色又黄又爽网站www久久| 欧美人妻精品一区二区三区 | 久久嫩草捆绑紧缚| 久久天堂av综合合色蜜桃网| 色姑娘综合天天| 另类综合日韩欧美亚洲| 男人日女人bb视频| 最新国产乱人伦偷精品免费网站| 黄瓜视频免费观看在线观看www| 精品产国自在拍| 精品久久蜜桃| 97品白浆高清久久久久久| 91免费在线视频网站| 深夜视频一区二区| 日韩免费黄色av| 老色鬼在线视频| 国外成人在线播放| 欧美另类tv| 欧美成人国产va精品日本一级| 天堂中文8资源在线8| 国产一区二区三区在线观看视频| 亚洲人视频在线观看| 亚洲第一天堂av| 性一交一乱一伧老太| 欧美一级生活片| 国产区精品在线| 制服丝袜在线91| 97成人在线观看| 91超碰这里只有精品国产| 亚洲天堂2021av| 欧美日韩一区在线| 91麻豆一区二区| 欧美精选一区二区| 在线免费一级片| 欧美精品久久一区| 国产男女猛烈无遮挡| 欧美一区二区视频免费观看| jizz国产视频| 欧美成人精品福利| 欧美一级性视频| 亚洲第一二三四五区| 天天综合网在线观看| 精品无码久久久久久国产| 日韩在线无毛| 国产亚洲成av人片在线观看桃| 国产在线视频网| 色综合伊人色综合网| 国产在线一区二区视频| 久久久久久久久综合| 美女高潮视频在线看| 欧洲成人在线观看| 国产69精品久久久久9999人| 91久久夜色精品国产网站| 日韩第一区第二区| 国产亚洲精品自在久久| 亚洲黄页网站| 亚洲一卡二卡三卡| 你懂的成人av| 欧美综合在线播放| 日韩av网站免费在线| 精品人妻一区二区三| 99视频有精品| 亚洲a∨无码无在线观看| 亚洲欧美精品午睡沙发| 日产欧产va高清| 欧美三级资源在线| 亚洲男人第一天堂| 国产香蕉精品视频一区二区三区| 免费网站免费进入在线| 久久久久在线观看| 丁香婷婷久久| 成人片在线免费看| av中文一区| 欧美久久久久久久久久久久久久| 亚洲欧美日韩专区| 91精品视频国产| 91亚洲大成网污www| 女同久久另类69精品国产| 亚洲国产婷婷综合在线精品| 国产精品熟女视频| 欧美大肚乱孕交hd孕妇| 第一页在线观看| 久久免费精品视频| 亚洲伊人伊成久久人综合网| 精品国产二区在线| 91精品国产91久久综合| 熟女性饥渴一区二区三区| 国产一级精品在线| 欧美aaa级片| 偷拍日韩校园综合在线| 99国产精品99| 国产亚洲精品综合一区91| 波多野结衣视频一区二区| 91天堂在线观看| 国产一卡不卡| 免费看的黄色大片| 成人小视频免费观看| chinese全程对白| 日本高清视频一区二区| 天堂在线视频免费观看| 久久99热精品| www.久久草.com| 午夜精品视频在线观看一区二区| 亚洲每日更新| 俄罗斯女人裸体性做爰| 中文字幕日韩一区| 成人黄色三级视频| 亚洲精品一区二区在线| 1024在线看片你懂得| 91亚洲国产成人精品性色| 欧美日韩一二| 黄色片在线免费| 国产亚洲一区字幕| 天天干天天干天天操| 亚洲第一网站男人都懂| 久久99亚洲网美利坚合众国| 999视频在线免费观看| 综合日韩在线| 国产精品久久久久久久99| 最近中文字幕一区二区三区| 在线观看色网站| 日韩在线视频网站| 四虎精品在线观看| 伊人久久青草| 国内不卡的二区三区中文字幕| 免费看的黄色录像| 欧美日韩日日夜夜| 午夜在线观看视频| 国产在线播放91| 91精品国产自产在线观看永久∴| 亚洲xxxx2d动漫1| 国产精品沙发午睡系列990531| 怡春院在线视频| 日韩有码在线观看| 国产精品久久久久久久久久久久久久久 | 男男做爰猛烈叫床爽爽小说| 亚洲综合视频网| 深夜福利视频网站| 欧洲精品久久久| 精品一区二区三区中文字幕老牛 | 女同一区二区免费aⅴ| 丁香五月网久久综合| 亚洲第一黄色| 久久中文字幕人妻| 一本大道久久a久久综合 | 在线电影中文日韩| 国外成人福利视频| 男人j进女人j| 大尺度一区二区| 日韩黄色在线播放| 中文欧美在线视频| 超碰国产精品一区二页| 白白操在线视频| 91免费精品国自产拍在线不卡| 国产伦精品一区二区三区视频网站| 亚洲系列中文字幕| 视频欧美精品| 成人性免费视频| 亚洲国产精品ⅴa在线观看| 97caocao| 欧美—级高清免费播放| 三级小说欧洲区亚洲区| 美女网站色免费| 亚洲在线免费播放| 欧美孕妇孕交xxⅹ孕妇交| 国产精自产拍久久久久久蜜| 欧美粗暴jizz性欧美20| 午夜久久久久久久| 欧美日韩一本到| av电影在线免费| 亚洲国产欧美一区二区三区不卡| 国产麻豆成人精品|