O Javascript possui um recurso chamado Inserção automática de ponto e vírgula, na qual, basicamente, se o analisador encontrar um token inválido e o último token anterior a uma quebra de linha, o analisador inserirá um ponto e vírgula no local da quebra de linha. Isso permite que você escreva basicamente todo o seu código javascript sem ponto-e-vírgula, mas você deve estar ciente de alguns casos extremos, principalmente se você tiver uma palavra-chave de retorno e o valor que deseja retornar em uma nova linha.
function test(){
// This will return 'undefined', because return is a valid statement
// and "john" is a valid statement on its own.
return
"john"
}
Devido a essas dicas, existem dezenas de artigos com títulos como 'A inserção automática de ponto e vírgula é má', 'Sempre use ponto e vírgula em Javascript' etc.
Mas, em Python, ninguém usa ponto e vírgula e ele tem exatamente as mesmas dicas.
def test():
# This will return 'undefined', because return is a valid statement
# and "john" is a valid statement on its own.
return
"john"
Funciona exatamente da mesma maneira e, no entanto, ninguém tem muito medo do comportamento de Pythons.
Eu acho que os casos em que o javascript se comporta mal são poucos o suficiente para que você possa evitá-los facilmente. Retornar + valor em uma nova linha? As pessoas realmente fazem muito isso?
Alguma opinião? Você usa ponto e vírgula em javascript e por quê?
fonte
#
, não `// '.Respostas:
O motivo é que, no Python, as novas linhas são uma maneira inequívoca de separar as linhas de código; isso ocorre por design e a maneira como isso funciona foi bem pensada. Como resultado, o código python é perfeitamente legível e inequívoco sem marcadores especiais de final de instrução (além da nova linha).
Javascript, por outro lado, foi projetado com uma sintaxe semelhante a C, em que as instruções são sempre terminadas com ponto e vírgula. Para tornar o idioma mais tolerante a erros, ele tenta adivinhar onde os pontos e vírgulas extras devem ir para corrigir o código. Como isso foi adaptado retroativamente à sintaxe do tipo C, nem sempre funciona como esperado (às vezes, o intérprete de script acha errado) e pode gerar um código contra-intuitivo. \
Ou, argumentar em termos de "explícito é melhor do que implícito": no Python, uma nova linha já é completamente explícita, enquanto no Javascript é ambígua, portanto, adicione o ponto e vírgula para torná-lo explícito.
fonte
Há uma diferença fundamental da maneira como funciona em Python, eu acho. Citando o post Einar Egilsson vinculado a: "um ponto-e-vírgula não está implícito no final de uma linha se o primeiro token da linha subseqüente puder ser analisado como parte da mesma declaração".
No Python, uma quebra de linha sempre termina a instrução, exceto em certos casos bastante óbvios, como dentro de uma expressão entre parênteses. O JavaScript, por outro lado, tentará analisar o máximo de linhas possível antes de terminar a instrução, levando potencialmente a coisas como esta:
fonte
(a + 1) ? do_something() : do_something_else();
e, de repente, a área é definida como o valor de retorno dedo_something()
oudo_something_else()
e você fica muito confuso.Costumo minimizar meus arquivos JS no modo de produção. Significa remover comentários e quebras de linha.
Sem o uso de ponto e vírgula, isso quebraria meu Javascript.
fonte
Não funciona como você descreve.
Isto está errado. Exemplo:
1
é um token perfeitamente válido, mas o analisador ainda inserirá um ponto-e-vírgula logo apósreturn
.Como você vê, nem você pode dizer exatamente onde um ponto e vírgula acontecerá.
O problema com a inserção automática é duplo:
Obviamente, o uso de ponto e vírgula após cada instrução ajuda apenas na primeira fonte de erros.
De qualquer forma, como você já deve adivinhar, acredito que a inserção automática de ponto e vírgula na sintaxe do tipo C é uma má idéia.
fonte
Eu indicaria uma razão simples:
Javascript parece "meio java-ish" ou "meio C-ish". Claro que é uma linguagem dinâmica, por isso parece diferente ... mas convenhamos - existem aparelhos. Idiomas com chaves geralmente têm ponto e vírgula. Os reflexos naturais entram em ação e fazem seu dedo ir em direção à tecla de ponto e vírgula antes de pressionar Enter.
Python, pelo contrário, mesmo de relance parece totalmente diferente. Portanto, pouca ou nenhuma analogia com "as linguagens chatas padrão" é formada intuitivamente e, quando se entra no "modo python", a falta de ponto e vírgula é natural.
fonte
Existem várias boas razões para não usar a inserção de ponto e vírgula no JavaScript.
Principalmente porque a inserção de ponto-e-vírgula, conforme definida no padrão ECMAScript, não é intuitiva em alguns casos. O @Svante indica um caso em
return
que o uso da nova linha causará problemas.O que ele não menciona é que isso causará problemas se você estiver usando ponto e vírgula também, porque a inserção de ponto e vírgula acontece se você deseja ou não.
Outra boa razão para não usar a inserção de ponto e vírgula é o controle de saída. Em muitos casos, o JavaScript é executado através de um minificador antes de ser usado na produção. Alguns minificadores podem lidar com casos de inserção automática de ponto-e-vírgula, mas não vejo razão para confiar nele funcionando perfeitamente
Além disso, para sistemas de gerenciamento de conteúdo, o JavaScript embutido pode ser auto-minificado, e já vi vários casos em que o auto-removedor simplesmente remove comentários e apara os espaços em branco (incluindo novas linhas) do início e do fim de cada linha.
Para autores que não têm escolha de quais ferramentas estão sendo escolhidas, é muito mais fácil manter um formato que funcione na grande maioria dos casos.
fonte
Não usar ponto-e-vírgula é uma receita para a falha ao reduzir os arquivos JavaScript. É por isso que tenho medo disso.
fonte
Em Javascript, você pode escrever um programa que estivesse sintaticamente correto na ausência de inserção automática de ponto e vírgula, e o ASI transformará esse programa em um programa sintaticamente correto diferente (por exemplo, transformar código que retorna um valor em código que não retorna nada). Não há caso análogo no Python. Em Python qualquer nova linha que pode acabar com uma declaração irá acabar com uma declaração, a menos que seja escapou com uma barra invertida. Tecnicamente, suponho que as regras do Javascript sejam igualmente determinísticas, mas não sei se você poderia resumir as regras do Javascript para finalizar instruções em uma única frase.
fonte
Na maioria dos casos, o ASI do JavaScript lida com as coisas conforme o esperado. Um exemplo de ASI talvez não se comporte da maneira que você esperaria é o seguinte:
Isso será interpretado como chamar a função
0
com a função anônima e depois executar o resultado. Nesse caso, você provavelmente queria fazer uma atribuição e, em seguida, execute imediatamente a função anônima.Para alguém não familiarizado com o ASI, pode ser muito confuso quando você se deparar com problemas como esse, por isso sempre recomendo que os desenvolvedores da minha equipe usem ponto e vírgula.
(Como um aparte: não uso ponto-e-vírgula ao trabalhar em projetos pessoais / paralelos, porque sei que ninguém mais precisaria manter o código.)
fonte
Como você, acho que é um pouco paranóico. As regras para inserção de ponto e vírgula estão bem definidas em JavaScript, assim como em Python e CoffeeScript. Ninguém nula Python ou CoffeeScript com ponto e vírgula, então por que o JavaScript é tratado de maneira diferente?
Eu acho que é uma reação exagerada ao estado miserável do código JavaScript típico de cerca de dez anos atrás - o JavaScript foi visto como uma linguagem fraca, com erros, feia e inútil. Foi uma vergonha. Você não poderia escrever um bom código em JavaScript!
Então, as pessoas apareceram e tentaram provar que era possível escrever um código bonito e claro em JavaScript. A regra " sempre use ponto e vírgula" fazia parte dessa onda. E para ser sincero, isso pode tornar algumas situações um pouco mais claras.
Por que o JavaScript ainda é tratado de maneira diferente?
Há inércia. E não se deve esquecer que as pessoas que apreciam códigos estruturados explicitamente preferem linguagens no estilo C. As pessoas que apreciam códigos estruturados implicitamente geralmente passam para linguagens que não são do tipo C (como o CoffeeScript).
fonte
Eu os uso em Javascript estritamente para consistência. Se a maioria das linhas tiver
O Python os possui para casos extremos, como várias instruções em uma única linha, o javascript os possui e, como você os encontrará regularmente usados, estou em conformidade com a norma em que eles são usados.
Não consigo encontrar um uso para várias instruções na mesma linha e, portanto, não prevejo usar ponto e vírgula.
fonte
Se você usar algo como bundle-fu e gerenciador de ativos para seu aplicativo da web nos trilhos, ele seria horrível se não encontrasse um ponto e vírgula no final do token em javascript. Portanto, é uma boa prática colocar um.
fonte
Não me lembro qual versão exata do IE, mas há alguns casos em que o IE literalmente errará se um ponto-e-vírgula estiver faltando. IIRC é quando você tem no escopo global algo como:
Se você não adicionar o; após a chave de fechamento, o programa realmente falhará em algumas versões do IE. Isso, juntamente com os outros motivos (incluindo a recomendação de Crockford de sempre usá-los explicitamente) me levou a sempre usá-los explicitamente em todos os casos.
fonte