São necessários ponto e vírgula após uma atribuição literal de object em JavaScript?

O código a seguir ilustra um literal de object sendo atribuído, mas sem ponto-e-vírgula depois:

var literal = { say: function(msg) { alert(msg); } } literal.say("hello world!"); 

Isso parece ser legal e não emite um aviso (pelo menos no Firefox 3). Isso é totalmente legal, ou existe uma versão estrita do JavaScript onde isso não é permitido?

Eu estou querendo saber em particular para futuros problemas de compatibilidade … Eu gostaria de estar escrevendo JavaScript “correto”, então se tecnicamente eu precisar usar o ponto-e-vírgula, eu gostaria de usá-lo.

Não tecnicamente, o JavaScript tem ponto e vírgula como opcional em muitas situações.

Mas, como regra geral, use-os no final de qualquer declaração. Por quê? Porque se você quiser comprimir o script, ele irá poupá-lo de incontáveis ​​horas de frustração.

A inserção automática de ponto-e-vírgula é executada pelo intérprete, para que você possa excluí-las se quiser. Nos comentários, alguém alegou que

Os pontos-e-vírgulas não são opcionais com instruções como break / continue / throw

mas isso está incorreto. Eles são opcionais; O que está realmente acontecendo é que os terminadores de linha afetam a inserção automática de ponto-e-vírgula; é uma diferença sutil.

Aqui está o resto do padrão sobre a inserção de ponto-e-vírgula:

Por conveniência, no entanto, tais pontos-e-vírgulas podem ser omitidos do texto de origem em determinadas situações. Essas situações são descritas dizendo que os ponto-e-vírgulas são inseridos automaticamente no stream do token de código-fonte nessas situações.

O YUI Compressor e o dojo shrinksafe devem funcionar perfeitamente bem sem ponto e vírgula, pois são baseados em um analisador JavaScript completo. Mas Packer e JSMin não vão.

A outra razão para usar sempre ponto-e-vírgula no final das instruções é que ocasionalmente você pode combinar acidentalmente duas instruções para criar algo muito diferente. Por exemplo, se você seguir a instrução com a técnica comum para criar um escopo usando um encerramento:

 var literal = { say: function(msg) { alert(msg); } } (function() { // .... })(); 

O analisador pode interpretar os colchetes como uma chamada de function, causando um erro de tipo, mas em outras circunstâncias pode causar um erro sutil que é difícil de rastrear. Outro acidente interessante é se a próxima instrução começar com uma expressão regular, o analisador pode achar que a primeira barra é um símbolo de divisão.

Intérpretes JavaScript fazem algo chamado “inserção de ponto-e-vírgula”, portanto, se uma linha sem um ponto-e-vírgula for válida, um ponto-e-vírgula será silenciosamente adicionado ao final da instrução e nenhum erro ocorrerá.

 var foo = 'bar' // Valid, foo now contains 'bar' var bas = { prop: 'yay!' } // Valid, bas now contains object with property 'prop' containing 'yay!' var zeb = switch (zeb) { ... // Invalid, because the lines following 'var zeb =' aren't an assignable value 

Não é muito complicado e pelo menos um erro é lançado quando algo claramente não está certo. Mas há casos em que um erro não é lançado, mas as instruções não são executadas como pretendido devido à inserção de ponto-e-vírgula. Considere uma function que deve retornar um object:

 return { prop: 'yay!' } // The object literal gets returned as expected and all is well return { prop: 'nay!' } // Oops! return by itself is a perfectly valid statement, so a semicolon // is inserted and undefined is unexpectedly returned, rather than the object // literal. Note that no error occurred. 

Bugs como esse podem ser enlouquecedoramente difíceis de caçar e, embora você não possa garantir que isso nunca aconteça (já que não sei como desativar a inserção de ponto-e-vírgula), esses tipos de bugs são mais fáceis de identificar quando você deixa claras suas intenções. consistentemente usando ponto e vírgula. Isso e adicionar explicitamente ponto e vírgula é geralmente considerado bom estilo.

Fui informado dessa insidiosa possibilidade ao ler o excelente e sucinto livro de Douglas Crockford, ” JavaScript: The Good Parts “. Eu recomendo fortemente .

Neste caso, não há necessidade de um ponto e vírgula no final da declaração. A conclusão é a mesma, mas o raciocínio está longe.

JavaScript não tem ponto e vírgula como “opcional”. Em vez disso, ele tem regras rígidas em torno da inserção automática de ponto-e-vírgula. Pontos-e-vírgulas não são opcionais com instruções como break , continue ou throw . Consulte a especificação da linguagem ECMA para mais detalhes; especificamente 11.9.1, regras de inserção automática de ponto-e-vírgula .

Use o JSLint para manter seu JavaScript limpo e arrumado

JSLint diz:

Erro:

Global implícita: alerta 2

Problema na linha 3 caractere 2: ponto e vírgula ausente.

}

O ponto-e-vírgula não é necessário. Algumas pessoas optam por seguir a convenção de sempre terminar com um ponto-e-vírgula em vez de permitir que o JavaScript faça isso automaticamente em quebras de linha, mas tenho certeza de que você encontrará grupos defendendo qualquer direção.

Se você está olhando para escrever JavaScript “correto”, sugiro testar coisas no Firefox com javascript.options.strict (acessado via about:config ) definido como verdadeiro. Pode não detectar tudo, mas deve ajudá-lo a garantir que seu código JavaScript seja mais compatível.

Isso não é válido (veja o esclarecimento abaixo) código JavaScript, já que a atribuição é apenas uma declaração regular, não diferente de

 var foo = "bar"; 

O ponto-e-vírgula pode ser deixado de fora, pois os intérpretes de JavaScript tentam adicionar um ponto-e-vírgula para corrigir erros de syntax, mas essa é uma etapa extra e desnecessária. Não conheço nenhum modo estrito, mas sei que analisadores automatizados ou compressores / obfuscadores precisam desse ponto-e-vírgula.

Se você quer escrever o código JavaScript correto, escreva o ponto-e-vírgula 🙂

De acordo com a especificação do ECMAscript, http://www.ecma-international.org/publications/standards/Ecma-262.htm , os pontos-e-vírgulas são automaticamente inseridos se ausentes. Isso os torna desnecessários para o autor do script, mas isso implica que eles são necessários para o interpretador. Isso significa que a resposta para a pergunta original é ‘Não’, eles não são necessários ao escrever um roteiro, mas, como é apontado por outros, é recomendado por várias razões.