摘要:會對對象中的每一個鍵值對調用函數,然后會使用其返回值,作為格式化后的值,比如使每個屬性的值遞增函數在省略敏感數據時,十分有用。如果它發現方法,會調用它,然后將它的返回值替換格式化后的值,比如方法可以返回任意的值,包括對象基礎類型,或者。
http://thecodebarbarian.com/t...寫在前面
JSON.stringfy()是將一個 JavaScript 對象轉化為 JSON 格式字符串的標準方式。許多 JavaScript 框架在其內部,都會使用 JSON.stringify():Express的 res.json()、Axios的 post,以及webpack stats,它們都調用了 JSON.stringify() 方法,并包含錯誤案例。
譯者注:這篇文章已經被翻譯過多次了,但是我覺得寫的太好了,所以就再翻譯一次吧,當作是加深印象。
簡單入門所有的現代 JavaScript 運行時都支持 JSON.stringify(),甚至 IE8 都支持它。下面是一個將簡單對象轉化為 JSON 的例子:
const obj = { answer: 42 }; const str = JSON.stringify(obj); str; // "{"answer":42}" typeof str; // "string"
你可能經常看到 JSON.stringify() 和 JSON.parse() 一起配合使用的場景,就像下面的代碼一樣,這種模式是實現深拷貝的方式之一:
const obj = { answer: 42 }; const clone = JSON.parse(JSON.stringify(obj)); clone.answer; // 42 clone === obj; // false錯誤以及邊界用例
JSON.stringify() 在轉化對象存在循環引用時,會拋出錯誤。更簡單地說,就是如果一個對象有一個屬性指向它本身,JSON.stringify() 會拋出錯誤,比如:
const obj = {}; // 存在循環引用的對象,它指向它本身 obj.prop = obj; // 會拋出 "TypeError: TypeError: Converting circular structure to JSON" 異常 JSON.stringify(obj);
這是 JSON.stringify() 會拋出異常的唯一情況,除非你通過聲明自定義的 toJSON() 方法或者 replacer 函數。盡管如此,你仍然應該將 JSON.stringify() 包含在 try/catch 語句中,因為循環引用在實踐中十分常見。
同時,一些邊界用例下,JSON.stringify() 并不會拋出錯誤,但是你可能卻期望它拋出錯誤。比如說,JSON.stringify() 會將 NaN 和 Infinity 轉化為 null:
const obj = { nan: parseInt("not a number"), inf: Number.POSITIVE_INFINITY }; JSON.stringify(obj); // "{"nan":null,"inf":null}"
JSON.stringify() 也會直接省略那些值為 functions 和 undefined 的屬性,如下:
const obj = { fn: function() {}, undef: undefined }; // 它會返回空對象 JSON.stringify(obj); // "{}"格式化
JSON.stringify() 的第一個參數是被序列化為 JSON 的對象。JSON.stringify() 實際上可以接受 3 個參數,同時第三個參數被稱作 spaces。spaces 參數被用于采用一種可以提高可讀性的方式來格式化 JSON 字符串。
你可以傳遞類型為 string 或者 number 的 spaces 參數。如果 spaces 為 undefined,那么 JSON.stringify() 會將每個鍵值放到多帶帶的一行,同時為其增加正確的縮進空格,比如:
const obj = { a: 1, b: 2, c: 3, d: { e: 4 } }; // "{"a":1,"b":2,"c":3,"d":{"e":4}}" JSON.stringify(obj); // { // "a": 1, // "b": 2, // "c": 3, // "d": { // "e": 4 // } // } JSON.stringify(obj, null, " "); // 數字 2 會達到和上面一樣的效果,它代表空格的個數 JSON.stringify(obj, null, 2);
spaces 字符串不一定非要是空格,雖然通常我們會使用空格,比如它也可以是下劃線:
// { // __"a": 1, // __"b": 2, // __"c": 3, // __"d": { // ____"e": 4 // __} // } JSON.stringify(obj, null, "__");Replacers
JSON.stringify() 的第二個參數是 replacer 函數。在上文的例子中,它等于 null。JavaScript 會對對象中的每一個鍵值對調用 replacer 函數,然后會使用其返回值,作為格式化后的值,比如:
const obj = { a: 1, b: 2, c: 3, d: { e: 4 } }; // 使每個屬性的值遞增 1 // "{"a":2,"b":3,"c":4,"d":{"e":5}}" JSON.stringify(obj, function replacer(key, value) { if (typeof value === "number") { return value + 1; } return value; });
replacer 函數在省略敏感數據時,十分有用。假設你想要省略所有包含 password 的屬性:
const obj = { name: "Jean-Luc Picard", password: "stargazer", nested: { hashedPassword: "c3RhcmdhemVy" } }; // "{"name":"Jean-Luc Picard","nested":{}}" JSON.stringify(obj, function replacer(key, value) { // 這個函數會被調用 5 次,這里的 key 依次為: // "", "name", "password", "nested", "hashedPassword" if (key.match(/password/i)) { return undefined; } return value; });toJSON 方法
JSON.stringify() 方法在遍歷對象的同時,也會關注那些擁有 toJSON() 方法的屬性。如果它發現 toJSON() 方法,JSON.stringify() 會調用它,然后將它的返回值替換格式化后的值,比如:
const obj = { name: "Jean-Luc Picard", nested: { test: "not in output", toJSON: () => "test" } }; // "{"name":"Jean-Luc Picard","nested":"test"}" JSON.stringify(obj);
toJSON() 方法可以返回任意的值,包括對象、基礎類型,或者 undefined。如果 toJSON() 返回 undefined,JSON.stringify() 將會忽略這個屬性。
很多 JavaScript 模塊使用 toJSON() 來確保序列化復雜對象的正確性,比如 Mongoose documents 和 Moment 對象。
最后JSON.stringify() 是 JavaScript 中較核心的基礎方法。許多庫和框架在其內部都使用它,因此,深入的理解它,可以幫助你更好地使用你喜歡的 npm 模塊。比如,你可以在 Express REST API 中利用 toJSON 方法來格式化原生 Date 類型,或者在 Axios 中,能夠正確地通過 HTTP 請求發送包含循環引用的對象。
關注公眾號 全棧101,只談技術,不談人生
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/104321.html
摘要:第三章原生函數有很多原生函數,為基本的數據類型值提供了封裝對象,,,等。我們可以通過來查看所有返回的對象的內置屬性這個屬性無法直接訪問。這個符號能有奇妙的功能,可以視為。通常用來把轉換為數字,用來將轉換為字符串,用來將取整。 第三章 原生函數JS有很多原生函數,為基本的數據類型值提供了封裝對象,String,Number,Boolean等。我們可以通過{}.call.toStri...
摘要:為了體現前后端分離,提高開發效率的精髓。轉發消息服務器將收到的來自于發送方消息中的值作為要轉發的目標接收方,在服務器自身維護的對象中找到接收方的這個連接,然后將發送方的標識作為轉發給接收方。 背景 簡單的描述一下需求場景:應用需要進行客戶端到客戶端的通信,websocket 就能很好的進行這一操作,目前 網易云信的 IM 等功能也是利用 websocket 進行的。 必要性 對前端開發...
摘要:業務組件模塊化拆分復用后整體可維護性也得到了很大提升。先贊一個當然凡事都有相對的一面,此篇文字就主要記錄自己在項目過程中的一些問題。 原文地址:http://mtmzorro.github.io/201... 項目背景 需要兼容到IE7(根據數據支撐重要說服拋棄IE6) 上個版本傳統 jQuery DOM 開發模式,經過無數手維護已經慘不忍睹 核心業務流程,可維護性、健壯性要求高 主...
摘要:眾所周知,中值的變化,會導致組件重新渲染。使用就是為了減少不必要的渲染。此方法就是拿當前中值和下一次中的值進行對比,數據相等時,返回,反之返回。使用進行深拷貝,但是遇到數據為和函數時就會錯。使用進行項目的搭建。 眾所周知,react中props,state值的變化,會導致組件重新渲染。使用shouldComponentUpdate就是為了減少render不必要的渲染。 本文著重回答以下...
閱讀 1387·2021-09-26 09:55
閱讀 1923·2019-08-30 12:45
閱讀 1064·2019-08-29 11:20
閱讀 3561·2019-08-26 11:33
閱讀 3428·2019-08-26 10:55
閱讀 1694·2019-08-23 17:54
閱讀 2391·2019-08-23 15:55
閱讀 2346·2019-08-23 14:23