精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91杏吧porn蝌蚪| 国产性色av一区二区| 亚洲欧美日韩精品久久久| 国产乱色精品成人免费视频| 亚洲高清成人| 一区二区三区国产视频| 一区二区在线免费观看视频| 欧美久久天堂| 亚洲人成伊人成综合网小说| 精品国产免费人成电影在线观...| 无码人妻熟妇av又粗又大| 亚洲最新av| 亚洲欧洲日产国产网站| 18深夜在线观看免费视频| 玛雅亚洲电影| 亚洲一区二区三区四区在线观看 | 久久九九热re6这里有精品 | 91精品国产91久久久久久最新| 四虎国产精品成人免费入口| 亚洲va欧美va人人爽成人影院| 色哟哟精品一区| 久久久久久久久久伊人| 成人免费黄色网页| 成人app下载| 成人午夜一级二级三级| 国产原创视频在线| 红桃视频亚洲| 成人a'v在线播放| 亚洲天天做日日做天天谢日日欢| 99久久精品无码一区二区毛片 | 欧美日韩国产综合久久| 久久视频这里有精品| 免费黄色电影在线观看| 国产视频一区二区三区在线观看| 国产欧美一区二区视频| 国产精品伦一区二区三区| 久久精品91| 欧美亚洲在线视频| 日韩精品一区二区在线播放| 伊人久久大香线| 精品国产一区二区三区久久久狼 | 亚洲精品免费在线| 亚洲午夜精品福利| 成人av毛片| 久久精品欧美一区二区三区不卡| 精品国产一区二区三区麻豆小说| 亚洲精品中文字幕成人片| 日夜干在线视频| 三级网站在线看| 亚洲视频在线免费| 少妇高潮 亚洲精品| 少妇久久久久久久久久| 日韩深夜福利| 日韩成人av在线| 日本五十肥熟交尾| 久久视频在线观看| 亚洲国产精品福利| 欧美精品欧美极品欧美激情| 国产美女撒尿一区二区| 亚洲精品一线二线三线无人区| 无套内谢丰满少妇中文字幕| 秋霞一区二区三区| 电影91久久久| 性欧美大战久久久久久久久| 日韩视频在线视频| 成人免费网站观看| 狠狠久久亚洲欧美专区| 欧美 日韩精品| 日韩新的三级电影| 欧美丝袜丝交足nylons| 在线观看av网页| 国产精久久一区二区| 日韩欧美亚洲一区二区| 中文字幕一区二区三区乱码不卡| 久久久久久毛片免费看| 亚洲日本成人网| 性爱在线免费视频| 伊人久久大香线| 性欧美暴力猛交69hd| 亚洲综合图片网| 麻豆国产一区二区| 99在线高清视频在线播放| 黄色一级a毛片| 久久美女艺术照精彩视频福利播放| 日本不卡一区| 搞黄网站在线观看| 五月天精品一区二区三区| 亚洲熟妇av一区二区三区| 国产激情久久| 精品久久久久久久人人人人传媒 | 欧美成人性色生活仑片| 国产在线视频卡一卡二| 首页国产欧美久久| 亚洲一区久久久| 亚洲欧美色视频| 中文字幕一区二区三区蜜月| www插插插无码免费视频网站| 亚洲一区资源| 91精品婷婷国产综合久久性色 | 99热这里精品| 91免费视频大全| 天天综合五月天| 香蕉成人av| 精品免费日韩av| 国产精品情侣呻吟对白视频| 亚洲二区免费| 国产综合福利在线| 日韩电影网址| 亚洲影视在线观看| 久久久久久久久久久久91| 9999精品免费视频| 亚洲欧洲av一区二区| 久久99国产精品一区| 国产在线一级片| 成人午夜短视频| 亚洲一区三区| 国产高清不卡无码视频| 亚洲精品一区二区三区四区| 国产片一区二区| 少妇大叫太大太粗太爽了a片小说| 日韩欧美一区二区三区免费观看| 欧美成人一级视频| 四虎地址8848| 丝袜a∨在线一区二区三区不卡| 91蜜桃网站免费观看| 中文字幕在线观看日本| 欧美性极品少妇精品网站| 国产又粗又猛又爽又黄| 久久伦理在线| 国产福利精品在线| 五月天丁香视频| 亚洲午夜一二三区视频| 天堂在线中文在线| 久久视频在线| 国产精品亚洲一区二区三区| 麻豆av电影在线观看| 午夜精品久久久久久久久久| 国产xxx在线观看| 久久精品一区二区不卡| 成人免费视频a| 免费黄色在线| 91.成人天堂一区| 日韩亚洲欧美中文字幕| 奇米色777欧美一区二区| 欧美一区二区福利| 欧美大片免费| 亚洲色图校园春色| 亚洲不卡视频在线观看| 久久综合九色综合欧美98| www.日本少妇| 欧美黑人巨大videos精品| 午夜精品久久久久久久白皮肤 | 欧美特黄aaaaaa| 99免费精品视频| 国产精品va无码一区二区| 精品自拍偷拍| 奇米成人av国产一区二区三区| 天堂成人在线| 一本到不卡免费一区二区| 黄瓜视频污在线观看| 噜噜爱69成人精品| 欧美日韩在线播放一区二区| 日韩av电影资源网| 日韩亚洲精品视频| 成人黄色免费视频| 亚洲第一狼人社区| 成人免费网站黄| 免费在线观看精品| 国产高潮呻吟久久久| 日韩精品一级| 国内偷自视频区视频综合| 天天操天天舔天天干| 欧美性生交大片免费| 久久视频精品在线观看| 久久99久久精品| 国产精品一线二线三线| 亚洲国产合集| 国产日韩在线观看av| aa在线视频| 亚洲黄页网在线观看| 草莓视频18免费观看| 成人免费一区二区三区视频| 91亚洲一线产区二线产区 | 亚洲精品国产a| 中文字幕精品久久久| 日韩精品一二三四| www国产无套内射com| 亚洲丁香日韩| 91久久极品少妇xxxxⅹ软件| 国产色播av在线| 色妞一区二区三区| 天天综合天天综合| 欧美日韩精品电影| 日本中文字幕网| 中文字幕欧美国产| 亚洲精品国产成人av在线| 青青草97国产精品免费观看 | 麻豆精品一区二区| 国产原创popny丨九色 | 日韩在线视频国产| 凸凹人妻人人澡人人添| 欧美日韩午夜精品| 天天插天天操天天干| 中文字幕一区免费在线观看| 亚洲av网址在线| 国产一二三精品| www.涩涩涩| 超碰免费在线公开| 久久av网址| 国产精品一区二区不卡视频| 久久久久伊人| 日韩免费av片在线观看| 欧美色图天堂| 久久色免费在线视频| 酒色婷婷桃色成人免费av网| 精品成人一区二区| 国产乱淫片视频| 91豆麻精品91久久久久久| 日本一级黄色大片| 亚洲乱码国产乱码精品精可以看| 久久久久久亚洲中文字幕无码| 成人黄色av电影| 国产黄色一区二区三区| 久久成人综合网| 激情视频综合网| 久久久久国产精品一区三寸| 国产妇女馒头高清泬20p多| 一区二区三区四区电影| 亚洲一卡二卡三卡| 精品国产不卡| 欧美日韩国产三区| 欧美成人一区在线观看| 国产精品国产精品国产专区蜜臀ah| 中文字幕日本一区| 国产精品视频xxxx| 欧美日韩在线精品一区二区三区激情综合 | 日本污视频网站| 91理论电影在线观看| 亚洲观看黄色网| 97se亚洲国产综合自在线不卡| 天天躁日日躁狠狠躁免费麻豆| 国产精品自拍三区| 少妇愉情理伦片bd| 大尺度一区二区| 91精品又粗又猛又爽| 粉嫩欧美一区二区三区高清影视 | 国产精品色婷婷在线观看| 成人一区二区电影| www.久久草.com| 91免费欧美精品| 日本精品一区二区三区在线观看视频| 成人激情视频在线播放| 国产一区二区av在线| 亚洲va国产va天堂va久久| 国产美女精品视频免费播放软件| 亚洲自拍在线观看| 亚洲经典视频| 国产视频一区二区不卡| 免费福利视频一区| 久久综合精品一区| 伊人久久大香线蕉无限次| 日韩高清国产一区在线观看| 日韩黄色大片| 国产盗摄视频在线观看| 国内精品美女在线观看| 日本福利视频一区| 性欧美暴力猛交另类hd| 中文字幕永久视频| 国产一区二区剧情av在线| av在线天堂网| 91蜜桃在线观看| 天天操天天干天天操天天干| 中文字幕在线观看不卡| 麻豆国产尤物av尤物在线观看| 无码av中文一区二区三区桃花岛| 久久久久久在线观看| 欧美精品xxxxbbbb| 亚洲第一免费视频| 亚洲午夜av电影| 黄色片网站在线观看| 久久久久久亚洲精品不卡| 亚洲优女在线| 成人在线精品视频| 国产亚洲成av人片在线观黄桃| 欧美在线视频一区二区三区| 久久一本综合| 奇米精品一区二区三区| 奇米在线7777在线精品| 精品久久久久一区二区| 国产精品三级av在线播放| 免费一级片视频| 色综合天天综合| 亚洲国产成人在线观看| 亚洲香蕉成人av网站在线观看| 国产精品剧情一区二区在线观看| 午夜精品一区二区三区av| 丁香婷婷久久| 国内一区在线| 久久中文字幕av| 欧美变态另类刺激| 久草精品在线观看| 公侵犯人妻一区二区三区| 亚洲精品视频在线观看网站| 久久久久久久久黄色| 日韩欧美一级在线播放| 国产高清视频在线| 午夜精品99久久免费| 95精品视频| 亚洲高清乱码| 亚洲欧美视频| 免费黄色三级网站| 亚洲男人电影天堂| 中文字幕人成人乱码亚洲电影| 亚洲成人久久电影| 老司机午夜在线| 国产精品视频一区二区高潮| 狠狠一区二区三区| 51xx午夜影福利| 久久 天天综合| 9.1片黄在线观看| 色综合天天性综合| 手机福利在线| 国模私拍视频一区| 一区二区三区高清在线观看| 亚洲第一页在线视频| 日本午夜精品一区二区三区电影| 一起草在线视频| 亚洲成av人综合在线观看| 国产成人麻豆精品午夜在线| 日韩午夜在线视频| 国产精品迅雷| 免费精品视频一区二区三区| 亚洲全部视频| 这里只有精品在线观看视频| 一区二区三区四区高清精品免费观看 | 欧美群妇大交群中文字幕| 国产综合在线观看| 日本乱人伦a精品| 婷婷精品在线观看| 国产精品沙发午睡系列| 99国产精品99久久久久久| 日韩激情一区二区三区| 日韩美女主播在线视频一区二区三区| 黄色成人影院| 51国产成人精品午夜福中文下载| 图片区亚洲欧美小说区| 在线观看日本www| 亚洲欧洲国产专区| 国产欧美熟妇另类久久久| 久久久www成人免费精品| 亚洲精品成a人ⅴ香蕉片| 99亚洲精品视频| 国产成人精品在线看| 久久精品免费av| 亚洲精品中文字幕有码专区| 高清av不卡| 亚洲精品中文综合第一页| 久久丁香综合五月国产三级网站| 开心激情五月网| 日韩欧美第一区| 17videosex性欧美| 麻豆av一区二区三区| 三级在线观看一区二区| 一本在线免费视频| 日韩欧美不卡一区| 国产网站在线| 日韩电影天堂视频一区二区| 久久se精品一区精品二区| 国产又黄又爽又无遮挡| 精品国产91洋老外米糕| 亚洲欧洲高清| 一区在线电影| 成人不卡免费av| 天天干天天操天天爱| 日韩亚洲精品视频| 国产精品乱战久久久| 日本成人黄色网| 亚洲欧美日韩在线| 亚欧洲精品视频| 国产伦精品免费视频| 在线不卡亚洲| 99精品欧美一区二区| 欧美成人在线直播| 日本韩国欧美| 红桃一区二区三区| 91麻豆成人久久精品二区三区| 国产九色91回来了| 欧美高清视频在线| 成人情趣视频| 亚洲美女精品视频| 在线观看亚洲专区| 丁香花在线高清完整版视频| 欧美日韩一区二| 国产精选一区二区三区| 亚洲第一在线播放| 欧美大奶子在线| 日韩a一区二区| 成人在线视频免费播放| 欧美一区二区三区四区在线观看| 精品人人视频|