Introdução: Por que "true" não é igual a true?
\n\nImagine a seguinte situação: você está desenvolvendo o frontend de uma loja virtual. O usuário marca a opção "Receber notificações por e-mail" e seu código salva essa preferência no localStorage como a string "true". Na próxima visita, você lê essa string e tenta verificar a condição:
let userPref = localStorage.getItem('notifications');\nif (userPref) {\n // Ativar notificações\n}\n\n\nSurpresa: a condição sempre é verdadeira! Mesmo que no localStorage esteja a string "false", o JavaScript a considera um valor truthy. Isso não acontece porque você fez algo errado, mas porque qualquer string não vazia em JS é considerada true.
Esse problema é tão comum que a pergunta no Stack Overflow já acumulou milhares de visualizações e dezenas de soluções diferentes. Hoje vamos entender de uma vez por todas como converter corretamente uma string em booleano no JavaScript, analisar 5 métodos funcionais e descobrir qual é o melhor.
\n\nPor que não posso simplesmente usar if()?
\n\nVamos logo esclarecer essa dúvida. Muitos iniciantes pensam: "Se eu escrever if(str), a string "false" vai se tornar false". Isso é um erro perigoso.
No JavaScript, existem apenas 6 valores considerados falsy (falsos):
\n- \n
false\n 0(zero) \n ""(string vazia) \n null\n undefined\n NaN\n
Todo o resto é truthy. A string "false" não é vazia — tem 5 caracteres. Portanto, ela é truthy. O mesmo vale para "0", "null" e até "undefined". A conversão simples com if() ou Boolean() não funciona para strings.
Top 5 métodos para converter string em booleano
\n\nTestamos todos os métodos populares encontrados em discussões do Stack Overflow e em projetos reais. Aqui estão eles, do pior ao melhor.
\n\nMétodo 1: Operador ternário (o mais óbvio, mas verboso)
\n\nfunction stringToBoolean(str) {\n return str === 'true' ? true : str === 'false' ? false : null;\n}\n\nconsole.log(stringToBoolean('true')); // true\nconsole.log(stringToBoolean('false')); // false\nconsole.log(stringToBoolean('yes')); // null\n\n\nVantagem: Fácil de entender para iniciantes.
\nDesvantagem: O código cresce rapidamente se você precisar tratar "yes", "1", "on". Você terá que escrever uma longa cadeia de condições.
Método 2: JSON.parse() (elegante, mas rigoroso)
\n\nfunction stringToBoolean(str) {\n try {\n return JSON.parse(str);\n } catch (e) {\n return null;\n }\n}\n\nconsole.log(stringToBoolean('true')); // true\nconsole.log(stringToBoolean('false')); // false\nconsole.log(stringToBoolean('TRUE')); // Erro! Retorna null\n\n\nO método JSON.parse() consegue interpretar as strings "true" e "false" como valores booleanos. Porém, há um detalhe: ele é sensível a maiúsculas e minúsculas. "True" ou "TRUE" geram um erro. Por outro lado, JSON.parse("null") retorna null, e não false — o que pode ser útil em alguns casos.
Método 3: Expressão regular (flexível, mas mais lento)
\n\nfunction stringToBoolean(str) {\n if (typeof str !== 'string') return null;\n return /^(true|yes|1|on)$/i.test(str.trim());\n}\n\nconsole.log(stringToBoolean('true')); // true\nconsole.log(stringToBoolean('YES')); // true\nconsole.log(stringToBoolean('off')); // false\nconsole.log(stringToBoolean('0')); // false\n\n\nAqui usamos a flag i (case insensitive) e tratamos várias variações de "verdade": true, yes, 1, on.