Ontem parei pra assistir mais uma palestra do Douglas Crockford.
Já falei aqui que o cara é amado e odiado na comunidade JavaScript, e creio que existe muito mito em torno disso.
Como programadores JavaScript, devemos prestar atenção em um fato: O Crockford entende muito da linguagem JavaScript. Provavelmente mais que todos nós.
Digo isso porque o embasamento nas teorias do Crockford fazem muito sentido, e apresentadas por ele, mostram que ele realmente entende do que esta falando.
Depois de longos anos estudando JavaScript, ainda não me considero apto a dizer que sou ninja, e que sei tudo. Até porque isso seria muita presunção minha.
O fato é o que o Crockford sim, parece ser ninja e parece saber tudo sobre a linguagem, então o mínimo que posso fazer é ouvir o homem, prestar atenção e correr atrás para quem sabe um dia ter o conhecimento suficiente para questionar as teorias do Douglas.
Durante a palestra o Crockford provou por a + b suas teorias. Abaixo compartilho algumas:
- Colocar a chave “{“ na direita
Ex:block { ... }Por costume, eu sempre coloco na direita mesmo. Mas muitos programadores colocam na esquerda, assim:
block { ... }A moral é que isso não importa. Na direita ou na esquerda, não importa…
Exceto no JavaScript. Rá!
Sim, para o JavaScript faz diferença, por um motivo simples.
Vejam o código:return { ok : false }Este código irá falhar.
Se queremos retornar um objeto literal, devemos sempre colocar a “{” na direita, porque neste caso o JavaScript retorna undefined.
Uma diferença sútil, e o seu programa não irá falhar:return { ok : false } - Usar sempre === ao invés de ==
Sempre tive a pulga atrás da orelha com essa premissa do Crockford. Mas ele explicou o porque, e de fato faz sentido.
O == não funciona muito bem no JavaScript. Até mesmo o Brendan sabia disso quando criou a linguagem.
O que aconteceu foi que quando a linguagem foi padronizada, o Brendan tentou corrigir isso com o comitê, mas a Microsoft insistiu que não deveria ser feito.
Porque diabos? Não sei.
Mas o Brendam conseguiu ao menos implementar o ===, então esse é o motivo de o porque sempre utilizar ===.
Alguns exemplos que provam a falha do == :0 == '' //true '' == '0' //false 0 == '0' //true false == 'false' //false false == '0' //true // E o mais bizarro de todos " trn " == 0 //true
- Declarar variáveis sempre no topo do corpo da função
Item bem interessante.
O Douglas explica na palestra que o JavaScript é diferente de outras linguagens em relação ao escopo de variáveis.
Em outras linguagens, devemos sempre declarar variáveis o mais próximo possível de onde vamos usa-las. No JavaScript é bem o contrário.
Devemos sempre declarar as variáveis no topo da função, poque de fato é isso que acontece, essa é a primeira coisa que é feita no fluxo da execução.
Antes do vídeo, deixo uma frase que achei muito interessante:
“Se existe uma feature de uma linguagem que às vezes é problemática, e se ela pode ser substituída por uma outra feature que é mais confiável, então sempre use a feature mais confiável”
Faz muito sentido.
Bom, RECOMENDO que todos vejam este vídeo. Mesmo os que não gostam do Crockford. Alias, principalmente os que não gostam.
Abram a mente, escutem, estudem, pesquisem.
O título do post “JavaScript, História e Ciência” deve-se ao fato de que a palestra do Crockford é isso. Uma aula de JavaScript, obviamente. Mas não só isso. É uma aula de história, onde ele conta vários fatos sobre diversas pessoas e linguagens. E também é uma aula de ciência, onde ele consegue fazer um link muito inteligente entre as confusões do nosso cerébro e a programação.
Vale muito a pena. Parem 1 hora e vejam.

Achei ele muito simpatico e muito didático.
Infelizmente achei a palestra pouco técnica. Nao sei a que publico foi direcionado, mas gostaria que ele fosse mais a fundo em determinadas questões.
Por exemplo, o “silent error” do return com objeto na linha debaixo não é um erro. As pessoas pensam que é a mesma coisa pois ninguém sabe como usar ponto e vírgula no javascript. (conheco apenas uma pessoa que sabe, e nao sou eu)
Return sempre termina a sua linha como se tivesse um ponto e virgula, daí o objeto abaixo é anônimo sem nenhum propósito programado.
Se comporta da mesma forma que colocar “use strict”. não interfere no programa de forma alguma. (apesar de alguns navegadores reconhecerem o código segundo as especificacoes do ecmascript5).
Quanto ao lance dos == e ===, 2 iguais é mais rápido que 3, os navegadores foram otimizados para o uso mais comum de comparações (ninguém liga para performance, eu sei). Os problemas acontecem porque as pessoas nao entendem como funcionam as conversões de tipo de valor em javascript.
Ex:
O resultado vai ser uma string em:
1 + ’2′ + [0] + false = ’120false’
Mas vai ser um numero em:
(1 + ’2′ + [0])*1 + true = 121
Se o javascript tem essa flexibilidade de tipos em cálculo matematico, não é a toa que isso acontece em condicionais de 2 iguais.
—
Não concordo com algumas coisas que ele prega mas aprendi muito pesquisando sobre o porque ele acha melhor certas formas. Na pior das hipóteses esse esforço é valido.
Alias, sempre que uma string tem .length maior que 0 e contiver caracteres não numéricos (ex: ‘a’, ’1a’) ela nunca será convertida em outros tipos de forma bem sucedida em comparações de 2 iguais.
‘false’, ‘ nr’, ‘undefined’ são texto e vão ser tratados em 2 iguais como tal. Recomendo brincar bastante no console e fazer experiencias a respeito. Vale a pena entender melhor essas conversões mesmo que se decida por usar 3 iguais.
Da mesma forma, o problema mais comum é:
a == 0
0 nesse caso pode ser convertido para quase qualquer tipo e dá muita confusão. Além da sugestão de usar === pode-se usar < 1 entre outras.
Grande Marcelo, comentário tão bem feito e elaborado quanto a palestra.
Realmente a palestra foi bem didática, mas pouco técnica, apesar de eu ter gostado muito dos fatos históricos citados.
E o lance do “The Gut” achei muito legal, mas isso é um gosto pessoal meu por essa área do cérebro e tal. Achei legal o link que ele fez das coisas.
Concordo que muito dos “erros” não são de fato erros, mas concordo com o Douglas quanto a legibilidade do código para outros programadores.
Claro, isso tudo é muito relativo, pois dependendo da equipe onde se trabalha, isso pode ser ignorado, e ser substituído por padrões e convenções da equipe.
JavaScript é uma linguagem dinâmica e o melhor é usar esse dinamismo, e claro, engessar as vezes atrapalha.
E claro, concordo contigo novamente sobre pesquisar o que foi dito pelo Crockford. Isso só nos tras benefícios.
Valeu pelo comentário muito bem elaborado e embasado.