Truque simples para deixar sua aplicação JS mais robusta
"Não confie no JavaScript."
–Todo programador que se preze.
Que o JavaScript é cheio de problemas, todos sabemos. Mas acredito que um dos maiores problemas são os valores e expressões truthy e falsy (ou boolean-ish).
O JavaScript tenta "booleanizar" as expressões dentro de um if (ou while). E essa é a causa de muitos bugs.
Por exemplo: if (0)
é avaliado como if (false)
. Mas e se um valor numérico zero for válido para sua aplicação?
E if ([])
é avaliado como if (true)
. Mas e se um array vazio não for válido?
Valor/expressão | Valor boolean-ish |
---|---|
NaN | false |
null | false |
undefined | false |
0 | false |
"" (string vazia) | false |
[] (array vazio) | true |
{} (objeto vazio) | true |
"true" (string) | true |
"false" (string) | true |
A solução
Para evitar esses problemas, garanta que as expressões avaliadas dentro de um if sejam verdadeiramente booleanas. Convertam valores em expressões ou funções que retornam um valor booleano.
Se x puder assumir o valor: | Em vez de if (x) , use: |
---|---|
NaN | if (Number.isNaN(x)) |
null | if (x === null) ou if (null === x) |
undefined | if (x === undefined) ou if (undefined === x) |
0 | if (x === 0) ou if (0 === x) |
"" (string vazia) | if (x === "") ou if ("" === x) ou if (x.length === 0) |
[] (array vazio) | if (x.length === 0) ou if (0 === x.length) |
{} (objeto vazio) | if (Object.keys(x).length === 0) ou if (0 === Object.keys(x).length) |
"true" | if (x === "true") ou if ("true" === x) |
"false" | if (x === "false") ou if ("false" === x) |
Mais exemplos
Se você quiser tratar strings "true"
como true
e "false"
como false
:
function getBooleanValueOf(str) {
return str.toLowerCase() === "true"; // Tudo o que não for "true" será tratado como false (inclusive "false")
}
if (getBooleanValueOf(x)) {
// ...
}
Se você espera um valor numérico qualquer, sendo zero um valor válido, mas ele pode ser undefined
, use if (x !== undefined)
.
Quem mais pode contribuir?