JavaScript,stringify,replacer - 返回undefined而不返回任何内容

时间:2013-08-02 18:05:04

标签: javascript undefined stringify

我正在对一个对象进行字符串化。

在一个案例中,我的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 未定义

感谢。

3 个答案:

答案 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!!!
    }