2013-08-02 3 views
0

Я строю объект.JavaScript, stringify, replacer - возвращает неопределенный или ничего не возвращает

В одном случае моя функция Заменитель возвращает неопределенную для всех свойств (объект запечатан):

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 есть не определено.

Спасибо.

ответ

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

Также обратите внимание, что вызывающая сторона вашей функции не может определить, была ли ваша функция явно возвращена undefined, или если она вернула undefined, потому что она ничего не вернула, если это не ясно. Эти два случая выглядят одинаково для вызывающего.

+0

справа. Я получаю это, но даже если ничего не будет возвращено, почему не получается, что результирующая строка все еще не является пустым объектом, как в первом случае? –

+0

@ R.V. держись, я продолжу ответ. – Pointy

+0

@ R.V. ответ обновлен. – Pointy

0

Функция:

function(k,v) { 
    if(Object.isSealed(this)) { 
     return undefined; 
    } 
}; 

кажется совершенно бессмысленным для меня. Это фистически не способен возврата ничего но не определено.

Ваша первая функция, однако, будет либо return undefined, либо значение, которое было передано.

В JavaScript, следующие функции будут считаться идентичными, насколько их возвращаемые значения:

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

function b() 
{ 
    return; 
} 

function c() 
{ 
} 
+0

Это бессмысленно, я знаю. Я пытаюсь понять, почему результирующая строка не является пустым объектом, когда replacer не возвращает значения? –

+0

Является ли 'Object.isSealed (this)' true или false? –

0

идеальный случай для использования возврата: - Когда функция генерации какое-то значение, и вы хотите передать он возвращается к вызывающему абоненту.

возвращение не определено MEANINGLESS.

Если вы хотите вернуться nothing-: Просто вернуть нулевой

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

Это неверно в случае функции 'JSON.stringify()'. Возвращаемое значение 'undefined' определенно означает что-то. (Теперь можно утверждать, что простой пустой оператор 'return' был бы более кратким, но в этом случае явное' undefined' имеет значение.) – Pointy

+0

@Pointy: я не уверен, что OP точно пытается сделать, но с ограниченным пониманием, что у меня есть о javascript, я не могу думать о какой-либо хорошей причине, почему любой хотел бы вернуть undefined..why не null или строку, если функция не генерирует никакого значения, просто спрашивая ... –

+0

, потому что API, который он использует, явно написан таким образом, что 'undefined' означает что-то. В этой ситуации «null» и «undefined» - это совсем не то же самое. (Ну, они на самом деле не то же самое когда-либо.) – Pointy