Vyhledávání na webu

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.

Související články