我正在对一个对象进行字符串化。
在一个案例中,我的replacer函数为所有属性返回 undefined (对象被密封):
str = JSON.stringify(o,function(k,v) {
if(Object.isSealed(this)) {
return undefined;
} else {
return v;
}
});
在另一个中,它根本不返回任何内容(当对象被密封时,何时没有):
str = JSON.stringify(o,function(k,v) {
if(Object.isSealed(this)) {
return undefined;
}
});
我想要了解的是,为什么在第一个场景中 str 是“{}”,而在第二个 str 未定义。
感谢。
答案 0 :(得分:1)
如果您未提供明确的return
,则返回值为undefined
。换句话说,您的第二个函数总是返回undefined
。因为函数总是返回undefined
,所以JSON字符串化结果中永远不会包含任何内容,因此总体效果是得到undefined
。
这样做是一种反模式:
if (something) {
return whatever;
}
else {
return somethingElse;
}
你的第一个功能更像是惯用的:
str = JSON.stringify(o,function(k,v) {
return Object.isSealed(this) ? undefined : v;
});
编辑 - 请注意JSON.stringify()
使用空键调用您的替换函数 ,并且“v”等于 一个新的包装器对象,其中包含要进行字符串化的对象(并注意 对象不密封)。也就是说,在检查要被字符串化的对象的每个属性之前,它询问替换器函数它是否应该作为整体对象工作。因为你的函数总是返回this
undefined
,所以stringify函数认为绝对没有什么可做的。它不能返回一个空对象,因为你的替换函数立即告诉它“不要在结果中包含这个”。
另请注意,函数的调用者无法确定您的函数是显式返回undefined
还是返回undefined
,因为它没有返回任何内容,如果不清楚的话。这两种情况看起来与调用者完全相同。
答案 1 :(得分:0)
功能:
function(k,v) {
if(Object.isSealed(this)) {
return undefined;
}
};
对我来说完全没有意义。它是不能返回任何但是未定义。
然而,您的第一个函数将 返回undefined
或传入的值。
在JavaScript中,就返回值而言,以下函数将被视为相同:
function a()
{
return undefined; // Provided undefined was not re-defined anywhere
}
function b()
{
return;
}
function c()
{
}
答案 2 :(得分:0)
使用返回的理想情况: - 当函数生成某个值并且您想将其传递回调用者时。
返回undefined MEANINGLESS 。
如果你想什么都不返回 - : 只需返回null
if(Object.isSealed(this)) {
return null;//or just dont return anything!!!
}