Почитал я тут немножко про разные управляющие конструкции, нелокальные выходы, и до меня дошло, почему throw может принимать любой тип аргумента. Потому что throw может бросить не только исключение, но и просто значение, которое можно потом отловить, причем выбросить оттуда, откуда стандартный выход практически невозможен. Например:
tst=function(arr, wanted){
try{
arr.forEach(function(el){if(el===wanted) throw el})
}catch(e){return e}
}
tst([1,2,3], 2)// 2
tst([1,2,3], 5)// undefined