Cuando desarrollé API como estas en el pasado, he validado todo lo que considero un requisito "importante": en su ejemplo, verificaría los dos primeros argumentos.
Siempre que especifique los valores predeterminados razonables, debería ser bastante simple para su usuario determinar que los argumentos "opcionales" no se especifican correctamente, ya que no hará ningún cambio en la aplicación, pero todo funcionará correctamente.
Si la API es compleja, sugiero seguir los consejos de Aaron: agregue comentarios que puedan ser analizados por un compresor para que los desarrolladores obtengan el beneficio de la validación, pero puedan extraer el peso muerto adicional al presionar el código en producción
EDIT:
Acá algunos ejemplos de lo que me gusta hacer en los casos en que es necesaria la validación. Este caso particular es bastante simple; Probablemente no me molestaría con la validación, ya que es realmente trivial. Dependiendo de sus necesidades, a veces intentar forzar tipos sería mejor que la validación, como se demuestra con el valor entero.
Supongamos extender() es una función que combina objetos, y existen las funciones de ayuda:
var f = function(args){
args = extend({
foo: 1,
bar: function(){},
biz: 'hello'
}, args || {});
// ensure foo is an int.
args.foo = parseInt(args.foo);
//<validation>
if(!isNumeric(args.foo) || args.foo > 10 || args.foo < 0){
throw new Error('foo must be a number between 0 and 10');
}
if(!isFunction(args.bar)){
throw new Error('bar must be a valid function');
}
if(!isString(args.biz) || args.biz.length == 0){
throw new Error('biz must be a string, and cannot be empty');
}
//</validation>
};
EDIT 2:
Si se quiere evitar errores ortográficos comunes, puede 1) aceptar y reasignarlos o 2) validar el recuento de argumentos. La opción 1 es fácil, opción 2 podría ser hecho como éste, aunque sin duda lo refactorizar en su propio método, algo así como Object.extendStrict() (código de ejemplo funciona w/prototipo):
var args = {
ar: ''
};
var base = {
foo: 1,
bar: function(){},
biz: 'hello'
};
// save the original length
var length = Object.keys(base).length;
// extend
args = Object.extend(base, args || {});
// detect if there're any extras
if(Object.keys(args).length != length){
throw new Error('Invalid argument specified. Please check the options.')
}
Esa es una gran idea. Además de eso, incluso podría 'decorar' una función para validar sus argumentos, y dejar la función original 'limpia'. – xtofl