javascript - boolean v if příkazu
Dnes jsem dostal poznámku ohledně kódu vzhledem k tomu, jak kontroluji, zda je proměnná pravdivá nebo nepravdivá v školním úkolu.
Kód, který jsem napsal, byl něco takového:
var booleanValue = true;
function someFunction(){
if(booleanValue === true){
return "something";
}
}
Říkali, že je lepší/hezčí to napsat takto:
var booleanValue = true;
function someFunction(){
if(booleanValue){
return "something";
}
}
Poznámka, kterou jsem získal ohledně části „=== true“, byla taková, že nebyla potřeba a mohla způsobit zmatení.
Můj názor je však takový, že je lepší zkontrolovat, zda je proměnná boolean, zejména vzhledem k tomu, že Javascript je jazyk s volným typováním.
Ve druhém příkladu by řetězec také vrátil „něco“;
Takže moje otázka; Je v budoucnu přehlednější vynechat část „=== true“, nebo je dobrá praxe kontrolovat i typ proměnné.
Upravit: V mém „skutečném“ kódu boolean reprezentuje, zda byla obrázek smazán nebo ne, takže jediné hodnoty, které by boolValue měl kdy mít, jsou true nebo false.
Například 0 a 1 by neměly být v té proměnné.
Odpověď č. 1
Nejprve fakta:
if (booleanValue)
Budou splněny podmínky příkazu if pro jakoukoli pravdivou hodnotu booleanValue, včetně true, jakéhokoli nenulového čísla, jakéhokoli neprázdného řetězce, jakéhokoli objektu nebo odkazu na pole atd...
Na druhou stranu:
if (booleanValue === true)
Tento příkaz podmínky if bude splněn pouze tehdy, pokud je booleanValue přesně rovno true. Žádná jiná pravdivá hodnota ji nesplní.
Na druhou stranu, pokud uděláte toto:
if (someVar == true)
Pak JavaScript provede typovou konverzi true, aby odpovídala typu someVar, a pak porovná tyto dvě proměnné. Existuje mnoho situací, kdy to pravděpodobně není to, co by člověk zamýšlel. Z tohoto důvodu ve většině případů chcete == vyhnout, protože existuje poměrně dlouhá sada pravidel, jak JavaScript provede typovou konverzi dvou věcí, aby měly stejný typ, a pokud nerozumíte všem těmto pravidlům a nemůžete předvídat vše, co interpretr JS může udělat při použití dvou různých typů (což většina JS vývojářů nemůže), pravděpodobně chcete == zcela vyhnout.
Jako příklad toho, jak to může být matoucí:
var x;
x = 0;
console.log(x == true); // false, as expected
console.log(x == false); // true as expected
x = 1;
console.log(x == true); // true, as expected
console.log(x == false); // false as expected
x = 2;
console.log(x == true); // false, ??
console.log(x == false); // false Pro hodnotu 2 byste si mysleli, že 2 je pravdivá hodnota, takže by se porovnávala příznivě s true, ale takto typová konverze nefunguje. Převádí pravou hodnotu tak, aby odpovídala typu levé hodnoty, takže převádí true na číslo 1, takže porovnává 2 == 1, což určitě není to, co jste pravděpodobně zamýšleli.
Takže, kupující buď opatrný. Pravděpodobně je nejlepší se == téměř ve všech případech vyhnout, pokud výslovně nevíte, jaké typy budete porovnávat a neznáte, jak fungují všechny možné algoritmy převodu typů.
Takže to skutečně závisí na očekávaných hodnotách pro booleanValue a na tom, jak chcete, aby kód fungoval. Pokud víte předem, že bude mít pouze hodnotu true nebo false, pak ji můžete explicitně porovnat s
if (booleanValue === true)
je to jen přebytečný kód a zbytečný a
if (booleanValue)
je kompaktnější a lze tvrdit, že čistší/lepší.
Pokud na druhou stranu nevíte, co booleanValue může být, a chcete otestovat, zda je skutečně nastaveno na true bez jakýchkoli jiných automatických převodů typů, pak
if (booleanValue === true)
není to jen dobrý nápad, ale je to vyžadováno.
Například, pokud se podíváte na implementaci .on() v jQuery, má volitelnou návratovou hodnotu. Pokud zpětná volání vrátí false, jQuery automaticky zastaví šíření události. V tomto konkrétním případě, protože jQuery chce ZASTAVIT šíření pouze pokud bylo vráceno false, kontrolují návratovou hodnotu explicitně pomocí === false, protože nechtějí, aby undefined, 0 nebo "" či cokoli jiného, co by se automaticky převedlo na false, také vyhovovalo porovnání.
Například zde je kód zpětného volání pro zpracování událostí v jQuery:
ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );
if ( ret !== undefined ) {
event.result = ret;
if ( ret === false ) {
event.preventDefault();
event.stopPropagation();
}
}
Můžete vidět, že jQuery výslovně hledá ret === false.
Ale existuje také mnoho dalších míst v kódu jQuery, kde je vhodná jednodušší kontrola vzhledem k účelu kódu. Například:
// The DOM ready check for Internet Explorer
function doScrollCheck() {
if ( jQuery.isReady ) {
return;
}
...
Odpověď č. 2
Pokud napíšete: if(x === true), bude to pravda pouze pro x=true
Pokud napíšete: if(x), bude to pravda pro jakékoli x, které není: '' (prázdný řetězec), false, null, undefined, 0, NaN.
Odpověď č. 3
Obecně je čistší a jednodušší vynechat === true.
Avšak v JavaScriptu jsou tyto příkazy odlišné.
if (booleanValue) se vykoná, pokud je booleanValue pravdivé - cokoli jiného než 0, false, '', NaN, null a undefined.
if (booleanValue === true) se provede pouze tehdy, pokud je booleanValue přesně rovno true.
