91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JSON.stringify如何運用

發布時間:2022-03-11 16:27:39 來源:億速云 閱讀:157 作者:iii 欄目:開發技術

本篇內容主要講解“JSON.stringify如何運用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“JSON.stringify如何運用”吧!

    語法

    JSON.stringify(value[, replacer [, space]])

    參數

    replacer 參數

    replacer 參數可以是一個函數或者一個數組。作為函數,它有兩個參數,鍵(key)和值(value),它們都會被序列化。

    值得注意的是,在開始時, replacer 函數會被傳入一個空字符串作為 key 值,value代表著要被 stringify 的這個對象。隨后每個對象或數組上的屬性會被依次傳入。

    總的來說 replacer 參數就是用來手動忽略一些不想被序列化的屬性,有點類似過濾器的作用

    var foo = {
      id: 1,
      name: "sf",
      age: 18,
    };
    //作為函數,函數沒有返回值或者返回值為 undefined 時,忽略這個屬性值
    JSON.stringify(foo, (key, value) => {
      if (typeof value === "string") {
        return undefined;
      }
      return value;
    });
    //{"id":1,"age":18}
    
    //作為數組,數組的值代表將被序列化成 JSON 字符串的屬性名
    JSON.stringify(foo, ['id',"name"]);
    //{"id":1,"name":"sf"}

    space 參數

    space 參數用來控制結果字符串里面的間距。如果是一個數字, 則在字符串化時每一級別會比上一級別縮進多這個數字值的空格(最多10個空格);如果是一個字符串,則每一級別會比上一級別多縮進該字符串(或該字符串的前10個字符)。實際使用基本都是用來美化輸出。

    let a = JSON.stringify({ a: 1, b: 2 }, null, 2);
    let b = JSON.stringify({ a: 1, b: 2 }, null, "  ");
    console.log(a == b); //true
    
    JSON.stringify({ a: 1, b: 2 }, null, "--");
    // {
    // --"a": 1,
    // --"b": 2
    // }

    特性描述

    1. undefined、Symbol值、函數

    • 出現在對象屬性值中: undefined、Symbol值、函數,在序列化過程中將會被忽略

    • 出現在數組中: undefined、Symbol值、函數 會被轉化為 null

    • 單獨轉換時: 會返回 undefined

    const obj = {
      a: "a",
      b: undefined,
      c: Symbol(),
      d: function () {},
    };
    JSON.stringify(obj)
    // {"a":"a"}
    const arry = [undefined, Symbol("c"), function () {}];
    JSON.stringify(arry); 
    //[null,null,null]
    JSON.stringify(undefined); 
    // undefined
    JSON.stringify(Symbol(111));
    // undefined
    JSON.stringify(function () {});
    // undefined

    2. 非數組對象的屬性不能保證以特定的順序出現在序列化后的字符串中

    正如在第一特性所說,JSON.stringify() 序列化時會忽略一些特殊的值,所以不能保證序列化后的字符串還是以特定的順序出現(數組除外)。

    3. 布爾值、數字、字符串的包裝對象在序列化過程中會自動轉換成對應的原始值

    JSON.stringify([new Boolean(true), new Number(1), new String("a")]);
    // [true,1,"a"]

    4. 轉換值如果有 toJSON() 方法,該方法定義什么值將被序列化

    const obj = {
      a: "aaa",
      toJSON() {
        return "hello world";
      },
    };
    JSON.stringify(obj);
    // "hello world"

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

    const obj = {
      name: "loopObj",
    };
    const loopObj = {
      obj,
    };
    // 對象之間形成循環引用,形成閉環
    obj.loopObj = loopObj;
    JSON.stringify(obj);
    //TypeError: Converting circular structure to JSON

    6. 所有以 symbol 為屬性鍵的屬性都會被完全忽略掉,即便 replacer 參數中強制指定包含了它們。

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

    const obj = {
      a: "aaa",
      [Symbol("foo")]: "foo",
    };
    JSON.stringify(obj);
    // {"a":"aaa"}
    JSON.stringify(obj, function (k, v) {
      if (typeof k === "symbol") {
        return "a symbol";
      }
    });
    // undefined

    7. 日期調用了 toJSON() 將其轉換為了 string 字符串(同Date.toISOString()),因此會被當做字符串處理。

    JSON.stringify({
      date: new Date("2022-02-02"),
    })
    // {"date":"2022-02-02T00:00:00.000Z"}

    8. NaN 和 Infinity 格式的數值及 null 都會被當做 null。

    JSON.stringify([NaN, Infinity, 1 / 0, Number("a")]);
    // [null,null,null,null]

    9. 其他類型的對象,包括 Map/Set/WeakMap/WeakSet,僅會序列化可枚舉的屬性。

    // 不可枚舉的屬性默認會被忽略:
    JSON.stringify(
      Object.create(null, {
        x: { value: "x", enumerable: false },
        y: { value: "y", enumerable: true },
      })
    );
    // "{"y":"y"}"

    應用

    localStorage

    localStorage 中的鍵值對總是以字符串的形式存儲,所以當我們需要把一個對象存在 localStorage 中時,只能用 JSON.stringify 將其轉化成字符串存儲,使用的時候用 JSON.parse 方法去取

    const userInfo = { user: "admin" };
    localStorage.setItem("userInfo", JSON.stringify(userInfo));
    JSON.parse(localStorage.getItem("userInfo"));
    // {user: 'admin'}

    對象深拷貝

    使用 JSON.parse(JSON.stringify) 是實現對象的深拷貝最簡單粗暴的方法。但是由于 JSON.stringify 的一些特性,會產生問題,例如:

    • undefined、Symbol、 函數, 對象中會被忽略,數組中會被序列化成 null。

    • NaN、Infinity 和 -Infinity 會被序列化成 null。

    • 循環引用問題,stringify 會報錯。

    當確定不存在以上情況時,才考慮使用 JSON.parse(JSON.stringify) 進行深拷貝。

    屬性過濾

    當接口返回一大堆數據,我們只想存某幾個屬性的時候,通過 replacer 函數過濾屬性是一個不錯的小技巧。

    var foo = {
      id: 1,
      name: "sf",
      age: 18,
    };
    localStorage.setItem("user", JSON.stringify(foo, ["id", "name"]));
    localStorage.getItem("user");
    //{"id":1,"name":"sf"}

    到此,相信大家對“JSON.stringify如何運用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    奉贤区| 县级市| 五指山市| 界首市| 和政县| 昆山市| 西峡县| 凤庆县| 南投市| 墨江| 龙里县| 甘谷县| 贵港市| 营山县| 灵璧县| 洛浦县| 汝南县| 平定县| 苍溪县| 通河县| 大新县| 陕西省| 克东县| 海门市| 沁阳市| 米泉市| 正定县| 淮安市| 淳安县| 颍上县| 青田县| 光泽县| 蚌埠市| 洛阳市| 容城县| 石景山区| 江都市| 大兴区| 时尚| 泸水县| 社旗县|