Em JS, você pode retornar um booleano com propriedades customizadas. Por exemplo. quando o Modernizr testa o suporte a vídeo, ele retorna true
ou false
o Booleano retornado (Bool é um objeto de primeira classe em JS) possui propriedades que especificam quais formatos são suportados. No começo, me surpreendeu um pouco, mas depois comecei a gostar da ideia e comecei a me perguntar por que ela parece ser usada com moderação?
Parece uma maneira elegante de lidar com todos os cenários em que você basicamente quer saber se algo é verdadeiro ou falso, mas pode estar interessado em algumas informações adicionais que você pode definir sem definir um objeto de retorno personalizado ou usar uma função de retorno de chamada preparada para aceite mais parâmetros. Dessa forma, você mantém uma assinatura de função muito universal sem comprometer a capacidade de retornar dados mais complexos.
Existem 3 argumentos contra isso que posso imaginar:
- É um pouco incomum / inesperado quando provavelmente é melhor para qualquer interface ser clara e não complicada.
- Este pode ser um argumento simples, mas, com um pouco de dificuldade, posso imaginar que ele sai pela culatra em algum otimizador de JS, uglifier, VM ou após uma pequena alteração na especificação da linguagem de limpeza etc.
- Existe uma maneira melhor - concisa, clara e comum - de fazer exatamente o mesmo.
Então, minha pergunta é: existem razões fortes para evitar o uso de booleanos com propriedades adicionais? Eles são um doce ou travessura?
A plotagem distorce o aviso.
Acima está a pergunta original em plena glória. Como Matthew Crumley e senevoldsen apontaram, é baseado em uma premissa falsa (falsidade?). Na tradição JS, o que o Modernizr faz é um truque de linguagem e um truque sujo. Tudo se resume a JS tendo um bool primitivo que, se definido como false, permanecerá falso, mesmo depois de TENTAR adicionar adereços (que falham silenciosamente) e um objeto booleano que pode ter adereços personalizados, mas ser um objeto é sempre verdadeiro. Modernizr retorna um objeto booleano booleano falso ou verdadeiro.
Minha pergunta original assumiu que o truque funciona de maneira diferente e, portanto, as respostas mais populares lidam com o aspecto (perfeitamente válido) dos padrões de codificação. No entanto, acho as respostas que desmembram todo o truque mais útil (e também os argumentos finais contra o uso do método), por isso estou aceitando uma delas. Obrigado a todos os participantes!
null
se não forem suportados e uma matriz de formatos, se houver. Uma lista é considerada verdadeira em JS e null
é falsa.