0

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

在一种情况下,我的替换函数为所有属性返回未定义(对象已密封):

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"{}",但在第二个场景中strundefined

谢谢。

4

3 回答 3

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”等于包含要字符串化的对象的新包装对象(并注意对象密封)。也就是说,在检查要字符串化的对象的每个属性之前,它会询问替换函数是否应该对整个对象起作用。因为您的函数总是返回,所以 stringify 函数认为绝对没有什么可做的。它不能返回一个空对象,因为你的替换函数立即告诉它“不要在结果中包含这个”。thisundefined

另请注意,您的函数的调用者无法确定您的函数是显式返回undefined还是返回undefined,因为它没有返回任何内容,以防不清楚。这两种情况在调用者看来完全一样。

于 2013-08-02T18:06:20.250 回答
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()
{
}
于 2013-08-02T18:09:04.133 回答
0

使用return的理想情况:- 当函数生成一些值并且您想将其传递回调用者时。

返回 undefined 是无意义的。

如果你想什么都不返回 - :只需返回 null

if(Object.isSealed(this)) {
        return null;//or just  dont return anything!!!
    }
于 2013-08-02T18:16:29.667 回答