Если вы не указали явное 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
a новый обертка объект, содержащий объект, подлежащий стригированию (и обратите внимание, что что объект не запечатан). То есть, прежде чем проверять каждое свойство объекта, подлежащего сжатию, он запрашивает функцию замены, должен ли он работать с объектом в целом. Поскольку ваша функция всегда возвращает undefined
, функция stringify считает, что абсолютно ничего не нужно делать. Он не может вернуть пустой объект, потому что ваша функция-заменитель сразу же сказала, что «не включать это в результат».
Также обратите внимание, что вызывающая сторона вашей функции не может определить, была ли ваша функция явно возвращена undefined
, или если она вернула undefined
, потому что она ничего не вернула, если это не ясно. Эти два случая выглядят одинаково для вызывающего.
справа. Я получаю это, но даже если ничего не будет возвращено, почему не получается, что результирующая строка все еще не является пустым объектом, как в первом случае? –
@ R.V. держись, я продолжу ответ. – Pointy
@ R.V. ответ обновлен. – Pointy