Pesquisar

2 de nov de 2016

Why JavaScript is evil


Por quê JavaScript é do mal?


Uma imagem para explicar tudo, abra o console do seu navegador (F12) e confira...






Isso acontece por causa da inferência de tipos agregada a fraca tipagem. Parece também que, o JavaScript quando "não sabe" inferir um tipo para calcular/executar com outro, ele transforma um dos lados da operação para um tipo calculável, no caso do "Object", transforma em String, usando o método toString(), e os demais, ocorre transformações com erros de floats e algumas variáveis ou palavras da própria linguagem ele transforma em "1", "0" (como null) etc, e calcula... Realmente lamentável.

Solução: usar uma linguagem que compile para o JavaScript, como LiveScript, ClojureScript, Dart, TypeScript, etc...

Estamos em um momento da história onde há pessoas (inclusive da Google, Mozilla e Microsoft) já desenvolvendo o "WebAssembly", espécies de bytecodes/binários (? alguém confirme) que serão lidos em todos os navegadores e então, poderão ser usadas outras linguagens de programação que compilem para projetar os sites e sistemas, sem usar mais o JavaScript.
Provavelmente o JavaScript vai ser outra linguagem que irá compilar para "WASM", mas isso é incerto pelas minhas pesquisas até agora.


5 comentários:

  1. Parabens pelo artigo! seu site é muito bom !

    ResponderExcluir
  2. Erros de ponto flutuante como o apresentado são inerentes à representação binária dos valores. Não dá pra ter precisão infinita. Isso não é do javascript. Em qualquer linguagem que use um tipo flutuante nativo você vai ter esse mesmo problema.

    Sempre que você for comparar valores decimais você precisa especificar a precisão da comparação, por exemplo ao invés de escrever:
    (0.1 + 0.2) + 0.3 == 0.1 + (0.2 + 0.3)
    Você coloca:
    Math.abs( ( (0.1 + 0.2) + 0.3 ) - ( 0.1 + (0.2 + 0.3) ) ) < 0.000001

    ResponderExcluir
    Respostas
    1. Entendi, masss, em outras linguagens não retornaria "true" sem necessitar de uma função?

      Excluir
    2. Essa questão do ponto flutuante chega a ser irritante quando o pessoal quer alfinetar o JavaScript com isso, sendo que o mesmo código em C#, Java, C++, C, Ruby, Python, Lua e etc possuem o mesmo problema. Isso não é um problema exclusivo da linguagem, isso não é um mal só do JavaScript, quase todas as linguagens tem esse problema.

      E claro, obviamente que cada linguagem possuí a sua maneira de trabalhar com isso. C# tem nativo o tipo decimal, Java/JavaScript/Ruby possuem bibliotecas para isto, e alguns frameworks integram essa biblioteca de forma que trabalhar com armazenamento de tipos decimais no banco torna-se completamente transparente a necessidade de conversão usando a biblioteca explicitamente, no caso do rails, que converte automaticamente os valores para BigDecimal.

      Os demais pontos levantados realmente são defeitos horrorosos da linguagem, mas sinceramente, faz anos que eu não tenho mais problemas com esses casos. Somar um objeto com um array? O programador pode até reclamar e dizer "como assim? que linguagem bosta!", a culpa pode ser parte do JS por não lançar uma exceção ali, mas GRANDE PARTE DA CULPA é do programador, nem vem querer colocar toda a culpa no JS. Esses defeitos do JS são facilmente contornáveis, eu mesmo não sofro faz tempo com esses problemas, TEMPO MESMO.

      JS tem um legado horrível, mas as features da nova versão ES6+ estão deixando o código do JS cada vez mais expressivo e muito mais conciso, muito mesmo. Se fossemos falar de ES5, sim, então acharia a linguagem realmente ruim, porque possuir esses defeitos horrorosos e não possuir as features novas torna a linguagem bem horrível de se escrever... mas não é o caso de hoje em dia.

      Excluir