描述
JSON.stringify()的作用就是把 JavaScript 物件或陣列或其他簡單值轉換為字串,它還可以用于物件的深拷貝;對 JSON 字串進行格式化(縮進);在轉換之前對值進行替換操作,
特殊型別的處理
JSON.stringify()遇到函式、日期等型別的值會進行特殊處理,為了讓輸出結果好看一些,在函式的第三個引數,指明字串化后的結果縮進 2 個空格:
let jsonStr = JSON.stringify(
{
func: function () {},
date: new Date(),
unde: undefined,
null: null,
nan: NaN,
infi: Infinity,
infi0: -Infinity,
regp: new RegExp(/Android|iPad/)
},
null,
2
);
console.log(jsonStr);
輸出結果如下所示:
{
"date": "2022-08-31T13:34:25.223Z",
"null": null,
"nan": null,
"infi": null,
"infi0": null,
"regp": {}
}
JSON.stringify()對以下型別的值進行特殊處理:
- 函式:函式直接被忽略,不輸出到字串中,
- Date:原本 new 一個日期的結果時 "Wed Aug 31 2022 21:38:37 GMT+0800 (中國標準時間)",在被字串化之后變成了如上格式,
- undefined:undefined 直接被忽略,不輸出,
- null:null 就是 null 本身,
- NaN:Nan 型別被轉化成 null,
- Infinity 和 -Infinity:都被轉化成 null,
- RegExp:RegExp 直接輸出一個空物件 {},
運用場景
物件深拷貝
通過=無法真正拷貝一個物件,而是參考物件的記憶體地址,詳細請看JavaScript - 物件參考和復制,
JSON.stringify()和JSON.parse()一起搭配使用就可以深拷貝一個物件:
let obj = { age: 10, name: "XiaoMing" };
let copy = JSON.parse(JSON.stringify(obj));
obj.age = 12;
copy.age = 14;
console.log(obj.age, copy.age); // => 12, 14
修改原物件obj的 age 屬性之后不影響深拷貝之后的物件copy的屬性,
存盤物件到 LocalStorage
window.localStorage.setItem(key, value)的兩個引數都只接受字串型別的值,如果強行把物件、陣列存盤到本地存盤里面,最終的結果是:

所以,這時候就不得不把物件、陣列進行字符化,也就是用JSON.stringify():
let obj = { age: 10, name: "XiaoMing" };
window.localStorage.setItem("obj", JSON.stringify(obj));
然后就能正常顯示出物件了:
如果從本地存盤中拿這個值,不要忘記用JSON.parse()決議字串,
第二個引數
第二個引數可以傳遞一個函式也可以傳遞一個陣列,每一種型別都有不同的作用,傳遞函式我們可以對原物件做一個過濾處理或者其他的操作,傳遞陣列就是輸出結果只保留陣列里面給的那幾個 key 以及對應的值,
傳遞函式
函式接收兩個值,key 和 value,key 不可以被改變,value 可以改變,且在改變之后必須要把 value 回傳出去,否則無法執行下一步,導致最終只輸出一個空,
let obj = { age: 10, name: "XiaoMing" };
let json = JSON.stringify(obj, (key, value) => {
if (key === "age") {
value = https://www.cnblogs.com/Enziandom/archive/2022/08/31/20;
}
return value;
});
console.log(json);
列印結果:
傳遞陣列
對于輸出結果,我們要進行一些取舍,就可以傳遞一個陣列,指定只輸出哪些 key 和 value:
let obj = { age: 10, name: "XiaoMing" };
let json = JSON.stringify(obj, ["age"]);
console.log(json);
列印結果:

那如果希望字符化后的物件只保留除了一些 key 以外的所有其他 key 和 value 呢?我寫了一個exclude函式,只針對于物件,去除不需要的物件欄位,其余都保留輸出:
function exclude(obj, exc) {
for (let i in exc) {
delete obj[exc[i]];
}
return Object.keys(obj);
}
let obj = { age: 10, name: "XiaoMing", school: "希望小學", address: "北京市朝陽區xxx號" };
let json = JSON.stringify(obj, exclude(obj, ["age", "address"]));
列印結果:
第三個引數
默認列印輸出的 JSON 字串是一行,沒有任何縮進的,第三個引數就是縮進多少個空格,
JSON.stringify(obj, exclude(obj, ["age", "address"]), 2);
縮進 2 個字符的結果:
{
"name": "XiaoMing",
"school": "希望小學"
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/503309.html
標籤:其他
下一篇:慎用JSON.stringify
