[英]Why does JSON.stringify ignore keys whose values are undefined?
為了更准確,我理解為什么這在技術上發生 - 因為undefined
不是有效的JSON類型:
var breakfast = {
"cereal" : "fruit loops",
"pastry" : undefined
};
console.log(breakfast);
// -> { cereal: 'fruit loops', pastry: undefined }
console.log(JSON.stringify(breakfast));
// -> {"cereal":"fruit loops"}
我的問題是 - 為什么這被認為是可接受的行為? 有明顯正當理由的原因,我想將undefined
作為API的一部分或其他任何東西傳遞。 這似乎有些危險 - 為什么函數不會引發錯誤而不是肆無忌憚地在沒有警告的情況下更改我的數據? 這似乎是JS的一個運行線程。
答案就在於ECMA-262規范 。 在第24.3.2 JSON.stringify ( value [ , replacer [ , space ] ] )
節24.3.2 JSON.stringify ( value [ , replacer [ , space ] ] )
,規范明確指出:
筆記2
未呈現未定義的值。
進一步:
注5
沒有JSON表示的值(例如未定義和函數)不會生成String。 相反,它們會產生未定義的值。 在數組中,這些值表示為String null 。 在對象中,不可表示的值會導致屬性從字符串化中排除。
因此,正如您使用JSON.stringify()
完全遵循現有的ECMA規范。
即使使用替換程序,而沒有專門指定自己的函數,默認的替換程序規則也規定只應追加項目 :
24.3.2第4.b.5.g小節
如果item 未定義且item當前不是PropertyList的元素
JSON意味着與語言無關。 它已經支持null
。 支持undefined
也會強制處理JavaScript對其他語言的特性之一,這違背了易於互操作的目的。
“JSON的設計目標是最小化,可移植,文本和JavaScript的子集。”
至於不拋錯誤,好吧
var x = { foo: undefined };
x.foo === undefined; // true
var json = JSON.stringify(x);
var y = JSON.parse(json);
y.foo === undefined; // true
所以JSON.stringify
可以創建一個表示值x
的字符串。 在這種情況下,拋出錯誤不會有用。 事實上,JSON.stringify忽略所有沒有JSON表示的值,因此忽略函數。 例如,這使得序列化對象數據變得容易。
最后,請記住JSON.stringify將一個replacer
函數作為參數,可用於改變字符串化的發生方式。 因此,要使JSON.stringify
拋出具有undefined
值的現有屬性:
var replacer = function(key, value){
if(value === undefined){
throw 'JSON.stringify: bad property: ' + key;
}
return value;
};
var x = {foo: undefined};
JSON.stringify(x, replacer);
// uncaught exception: JSON.stringify: bad property: foo
或者替換為null
:
var replacer = function(key, value){
if(value === undefined){
return null;
}
return value;
};
var x = {foo: undefined};
JSON.stringify(x, replacer); // '{"foo":null}'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.