JavaScript、stringify、replacer-返回未定义与不返回

JavaScript、stringify、replacer-返回未定义与不返回,javascript,undefined,stringify,Javascript,Undefined,Stringify,我正在串一个物体 在一种情况下,我的replacer函数为所有属性返回未定义的(对象是密封的): 在另一种情况下,它完全不返回任何内容(无论对象是否密封): 我想理解的是,为什么在第一个场景中str是“{}”,而在第二个场景中str是未定义的 谢谢。如果不提供明确的返回值,则返回值为未定义。换句话说,第二个函数总是返回未定义的。由于函数总是返回未定义的,因此JSON字符串化结果中永远不会包含任何内容,因此总体效果是得到未定义的 这样做有点反模式: if (something) { retur

我正在串一个物体

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

在另一种情况下,它完全不返回任何内容(无论对象是否密封):

我想理解的是,为什么在第一个场景中str是“{}”,而在第二个场景中str是未定义的


谢谢。

如果不提供明确的
返回值
,则返回值为
未定义
。换句话说,第二个函数总是返回未定义的
。由于函数总是返回
未定义的
,因此JSON字符串化结果中永远不会包含任何内容,因此总体效果是得到
未定义的

这样做有点反模式:

if (something) {
  return whatever;
}
else {
  return somethingElse;
}
您的第一个函数更为惯用,如下所示:

str = JSON.stringify(o,function(k,v) {
    return Object.isSealed(this) ? undefined : v;
});
编辑-请注意,
JSON.stringify()
首先使用一个空键调用replacer函数,并且“v”等于
this
包含要字符串化的对象的新包装器对象(请注意,该对象未密封)。也就是说,在检查要字符串化的对象的每个属性之前,它会询问replacer函数是否应该在整个对象上工作。因为您的函数总是返回未定义的
,所以stringify函数认为绝对没有什么可以做的。它不能返回空对象,因为您的replacer函数立即告诉它“不要在结果中包含它”

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

函数:

function(k,v) {
    if(Object.isSealed(this)) {
        return undefined;
    }
};
在我看来完全没有意义。从物理上讲,它只能返回未定义的内容

但是,您的第一个函数将返回
未定义的
,或者返回传入的值

在JavaScript中,以下函数的返回值将被视为相同:

function a()
{
   return undefined; // Provided undefined was not re-defined anywhere
}

function b()
{
   return;
}

function c()
{
}

使用返回的理想情况:- 当函数生成某些值时,您希望将其传递回调用方

返回未定义的值是无意义的

如果您不想退货-: 只需返回空值

if(Object.isSealed(this)) {
        return null;//or just  dont return anything!!!
    }

正确的。我明白了,但即使没有返回任何内容,为什么生成的字符串不像第一种情况那样仍然是空对象?@R.V.等等,我将扩展答案。RE:您的编辑。好啊但是为什么第一个案例不返回undefined,而是返回“{}”@R.V.是的,对。在第一个示例中,只有当
this
引用的对象被密封时,才返回
undefined
。在第一次调用时,
this
的值不是您的密封对象,它是浏览器为最初调用replacer函数而创建的另一个对象。因为该对象没有密封,所以函数返回“v”,而“v”的值就是密封的对象。因此,第一次返回
未定义的
是针对密封对象的第一个属性。结果是一个空对象。@R.V.在第二种情况下,它是包装器对象,但您总是返回
未定义的
!在第一种情况下,当
为密封对象时,仅返回
未定义
。这两个功能是不同的!我知道这毫无意义。我试图理解,当替换程序不返回任何值时,为什么生成的字符串不是空对象?是
object.isSealed(this)
true还是false?对于
JSON.stringify()
函数,情况并非如此。返回值
未定义
肯定意味着什么。(现在可以说一个纯空的
return
语句会更简洁,但在这种情况下,显式的
undefined
也有意义。)@Pointy:我不确定OP到底想做什么,但我对javascript的理解有限,我想不出任何人想要返回undefined的好理由。如果函数没有生成任何值,为什么不返回null或字符串?只是问一下……因为他使用的API是显式编写的,因此
undefined
意味着什么。在这种情况下,
null
undefined
根本不是一回事。(好吧,它们真的不是同一件事。)接受..我确实理解null和undefined之间的区别..但很难理解这样一个事实,即某些身体需要返回undefined..@MESSIAH OP偶然发现了这种差异,并试图理解其原因。所提供的代码没有任何用处或功能。
function a()
{
   return undefined; // Provided undefined was not re-defined anywhere
}

function b()
{
   return;
}

function c()
{
}
if(Object.isSealed(this)) {
        return null;//or just  dont return anything!!!
    }