javascript - JSLint - Ändra inte parametern <x> när du använder 'arguments'?
Alla,
Jag använder JSLint för att validera mina JS-filer. I mitt senaste projekt använder jag följande format för att sätta standardvärden för ett antal JavaScript-funktioner (mer detaljerat här):
function(a, b, option) {
option = arguments.length > 2 ? option : "some default value";
// ...
}
Detta orsakar dock att den senaste versionen av JSLint genererar följande fel:
"Do not mutate parameter 'option' when using 'arguments'."
Jag är medveten om att användningen av den mer vanliga metoden för att tilldela standardvärden (dvs. option=option || {};) undertrycker felet; dock kommer detta att ge fel beteende om jag avser att skicka ett falsey-värde till option.
Är den enda lösningen på detta problem att införa en ny variabel? t.ex.:
var option2 = arguments.length > 2 ? option : "some default value";
Svar #1
Jag antar att JSLint varnar dig eftersom du försöker ändra en av inmatningsargumenten genom att använda en kontroll med nyckelordet arguments. JSHint, däremot, ger mig inga varningar när jag försöker din kod.
En lösning på ditt problem skulle vara att kontrollera om option är definierad eller inte, på så sätt undviker du problemet med att skicka in falska värden:
function(a, b, option) {
if(typeof option === "undefined") {
option = "some default value";
}
// ...
}
Om du upptäcker att det är besvärligt att skriva denna typeof-kontroll varje gång, skapa en isDef-funktion:
function isDef(param) {
return typeof param !== "undefined";
}
function(a, b, option) {
option = isDef(option) ? option : "some default value";
// ...
}
// Simon A.
Svar #2
I de flesta situationer skulle du ha det bättre med att bara göra:
function(a, b, option) {
option = option || "some default value";
// ...
}
eller
function(a, b, option) {
if ( !option || typeof option !== 'string' ) {
option = "some default value";
}
// ...
}
