Лучшим и более надежным подходом будет:
1) проверяет количество переданных аргументов (представьте, что вы хотите разрешить передачу неопределенного значения или NULL, как в случае функции DOM insertBefore), и только после этого попытайтесь установить их значения, если они опущены:
function Foo(par1, par2)
{
if (arguments.length < 2)
par2 = "my default"
else
if (arguments.length < 3)
par3 = "my default"
}
2) или, если вы хотите запретить прохождение undefined, включите его в конструкцию:
function Foo(par1, par2)
{
if (arguments.length < 2 && par2 === undefined)
par2 = "my default"
else
if (arguments.length < 3 && par3 === undefined)
par3 = "my default"
}
3) или, если вы хотите запретить передачу нулевого значения, включите его в конструкцию:
function Foo(par1, par2)
{
if (arguments.length < 2 && (par2 === undefined || par2 === null))
par2 = "my default"
else
if (arguments.length < 3 && (par3 === undefined || par3 === null))
par4 = "my default"
}
Кстати: я бы рекомендовал избегать использования перегрузки функций, в действительности это вряд ли необходимо.