Hoje, enquanto eu estava lendo aleatoriamente o livro da O'Reilly sobre padrões de JavaScript, descobri uma coisa interessante (página 27 para referência).
Em Javascript, em alguns casos, há uma diferença se o local de início da chave for diferente.
function test_function1() {
return
{
name: 'rajat'
};
}
var obj = test_function1();
alert(obj); //Shows "undefined"
Enquanto
function test_function2() {
return {
name: 'rajat'
};
}
var obj = test_function2();
alert(obj); //Shows object
Alguma outra língua por aí tem esse comportamento? Se sim, então eu teria que mudar meu hábito com certeza .. :)
Estou principalmente preocupado com PHP, C, C ++, Java e ruby.
javascript
language-agnostic
programming-languages
language-design
Rajat Singhal
fonte
fonte
Respostas:
Qualquer linguagem que não dependa de ponto-e-vírgula (mas em vez de novas linhas) para delimitar as instruções permite isso. Considere Python :
Você pode ser capaz de construir um caso semelhante no Visual Basic, mas de repente não consigo descobrir como porque o VB é muito restritivo em onde os valores podem ser colocados. Mas o seguinte deve funcionar, a menos que o analisador estático reclame sobre código inacessível:
Das linguagens que você mencionou, Ruby tem a mesma propriedade. PHP, C, C ++ e Java não simplesmente porque descartam a nova linha como espaço em branco e exigem ponto-e-vírgula para delimitar as instruções.
Aqui está o código equivalente do exemplo Python em Ruby:
fonte
Throw
eex.GetBaseException()
são linhas lógicas separadas. Mais especificamente, visto que o Basic historicamente usa linhas para delimitar suas declarações, um "pegadinha" seria mais provavelmente uma situação em que um programador pensa que criou uma nova declaração em uma nova linha lógica, mas não o fez.O interpretador JavaScript adiciona automaticamente um
;
no final de cada linha se não encontrar um (com algumas exceções, não entrando nelas aqui :).Então, basicamente, o problema não é a localização dos colchetes (que aqui representam um objeto literal, não um bloco de código como na maioria das linguagens), mas este pequeno "recurso" que força seu primeiro exemplo a
return ;
=>undefined
. Você pode verificar o comportamento dereturn
na especificação ES5 .Para outras linguagens com comportamento semelhante, verifique a resposta de Konrad .
fonte
undefined
retorno. Eu escrevi um trecho sobre as outras línguas com o prefixo afaik , então aceite isso com cautela :).Certamente. A linguagem de programação go do Google exibe um comportamento muito semelhante (embora com efeitos diferentes). Conforme explicado lá:
Secretamente, acho que Rob Pike só queria uma desculpa para exigir o One True Brace Style.
fonte
A resposta a essa pergunta é bastante fácil. Qualquer idioma com "inserção automática de ponto-e-vírgula" pode ter problemas nessa linha. O problema com isso
..é que o mecanismo js irá inserir um ponto-e-vírgula após a
return;
instrução (e, portanto, retornarundefined
). Este exemplo é um bom motivo para abrir as chaves sempre do lado direito e nunca do lado esquerdo também. Como você já percebeu corretamente, se houver uma chave na mesma linha, o interpretador perceberá e não poderá inserir o ponto-e-vírgula.fonte
FWIW, JSLint relata vários avisos com essa sintaxe:
fonte
A primeira linguagem em que me deparei com isso foi awk (que também tem sua parcela de "esquisitices" de sintaxe; ponto e vírgula opcional, concatenação de string usando apenas espaços em branco e assim por diante ...) Acho que os designers do DTrace, que basearam a sintaxe D vagamente no awk, tive bastante bom senso para NÃO copiar esses recursos, mas não consigo me lembrar de cara. Um exemplo simples (contando o número de tags ENTITY em um DTD, do meu Mac):
Se este pequeno script fosse escrito com a chave em uma linha própria, isto é o que aconteceria:
fonte