javascript - JSLint - ¿No mutar el parámetro al usar 'arguments'?
Todos,
Uso JSLint para validar mis archivos JS. En mi proyecto más reciente, estoy usando el siguiente formato para establecer valores predeterminados para varias funciones de JavaScript (más detalles aquí):
function(a, b, option) {
option = arguments.length > 2 ? option : "some default value";
// ...
}
Esto, sin embargo, provoca que la última versión de JSLint produzca el siguiente error:
"Do not mutate parameter 'option' when using 'arguments'."
Soy consciente de que usar el método más común para asignar valores por defecto (es decir, option=option || {};) suprime el error; sin embargo, esto producirá un comportamiento incorrecto si tengo la intención de pasar un valor falsey a option.
¿Es la única solución a este problema introducir una nueva variable? por ejemplo:
var option2 = arguments.length > 2 ? option : "some default value";
Respuesta #1
Supongo que JSLint te avisa ya que intentas modificar uno de los argumentos de entrada usando una verificación con la palabra clave arguments. JSHint, sin embargo, no me da ninguna advertencia al probar tu código.
Una solución a su problema sería comprobar si option está definido o no, de esa manera evita el problema de enviar valores falsy:
function(a, b, option) {
if(typeof option === "undefined") {
option = "some default value";
}
// ...
}
Si encuentras que es engorroso escribir esta verificación typeof cada vez, crea una función isDef:
function isDef(param) {
return typeof param !== "undefined";
}
function(a, b, option) {
option = isDef(option) ? option : "some default value";
// ...
}
// Simon A.
Respuesta #2
En la mayoría de las situaciones, estarías mejor simplemente haciendo:
function(a, b, option) {
option = option || "some default value";
// ...
}
o
function(a, b, option) {
if ( !option || typeof option !== 'string' ) {
option = "some default value";
}
// ...
}
