Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
No desenvolvimento em JavaScript, identificar corretamente o tipo de uma variável é uma tarefa que parece simples, mas revela armadilhas que podem prejudicar a estabilidade do seu código. A mais comum delas é o uso do operador typeof, que, apesar de ser a abordagem mais direta, não captura todas as nuances de objetos string, especialmente quando criados com o construtor new String().
---
O typeof é eficiente para tipos primitivos, retornando 'string' para literais como '' ou "texto". Porém, ao criar um objeto string com new String(), o typeof retorna 'object', o que pode pegar muitos desenvolvedores de surpresa. Isso causa problemas na validação de tipos, especialmente em código que depende de distinguir entre primitivas e objetos.
Exemplo clássico:
let strLiteral = "Olá". let strObjeto = new String("Olá"). console.log(typeof strLiteral). // 'string'
console.log(typeof strObjeto). // 'object'
Se seu objetivo é verificar se uma variável é uma string verdadeira, ou seja, uma primitiva string, o typeof sozinho não é suficiente.
---
Para quem quer garantir que uma variável é uma string primitiva, a melhor estratégia é combinar o typeof com uma verificação de instanciação. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
const isString = value => typeof value === 'string'. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Esse método ignora objetos string criados com new String() e foca na primitiva. Ainda assim, há casos em que objetos podem “enganar” essa lógica, como objetos que sobrepõem o método toString ou construtores alterados. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Para cobrir esses casos mais avançados, uma abordagem que funciona bem na maioria das situações é usar o método Object.prototype.toString: Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
const isReallyString = value => Object.prototype.toString.call(value) === '[object String]'. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Ele é mais robusto, pois verifica a classe real do objeto, independentemente de como foi criado. Assim, um objeto criado com new String() será reconhecido corretamente. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
---
Implementar uma validação mais rigorosa aumenta a complexidade do código e pode impactar na performance, embora em aplicações comuns essa diferença seja mínima. Além disso, essa abordagem não diferencia entre uma string literal vazia e outros tipos, então, se precisar validar conteúdo ou formato, deve complementar com validações específicas. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Outra questão é o uso de objetos strings manipulados ou sobrescritos, que podem passar por essas verificações, mas não representam uma string válida como valor esperado. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Por fim, é importante lembrar que usar o método Object.prototype.toString é mais seguro, mas também mais verboso, então, para validações rápidas, uma combinação de typeof e instanceof pode ser suficiente na maioria dos casos. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois.
const isStringInstance = value => value instanceof String. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
No entanto, esse método só funciona com objetos criados com new String() e não com literais, o que reforça a necessidade de escolher a estratégia de validação correta para o seu contexto. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
---
Se sua aplicação depende de manipular entradas de usuário ou dados de APIs, o ideal é evitar objetos string, preferindo sempre literais. Quando lidar com objetos, use o método mais robusto que combine typeof com Object.prototype.toString. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Por fim, não se esqueça: validações devem ser consistentes ao longo de toda a aplicação. Uma rotina bem definida evita surpresas na hora de depurar ou quando precisar fazer mudanças rápidas. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Você costuma usar alguma dessas abordagens? Quais problemas já enfrentou na validação de tipos em JavaScript? Essas estratégias ajudaram a evitar bugs difíceis de rastrear? Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois.
hum, uma dúvida que tenho é até que ponto vale a pena validar tanto assim?
Legal, essa de usar Object.prototype.toString é uma que costuma passar batido, mas salva na hora de validar objetos complexos. Já passei por isso na prática, e essa abordagem realmente evita pegadinhas.
Concordo, Mariana. Aqui no time, a gente sempre valida usando ambos, typeof e Object.prototype.toString, em casos que o dado vem de fontes externas. Evita muita dor de cabeça depois.
Leandro, na minha experiência, validar o tipo ajuda a evitar bugs de runtime que são difíceis de rastrear, principalmente quando lida com APIs externas ou dados desestruturados. Acho que é uma questão de segurança.