Eu simplesmente amo JavaScript. É tão elegante (imagine o som quieto de fanboys apaixonados suspirando ao fundo).
Então, recentemente eu brinquei com Lua através da estrutura löve2d (legal!) - e acho que Lua também é ótima. Na minha opinião, essas duas línguas são muito parecidas.
Existem diferenças óbvias, como
- sintaxe
- domínio do problema
- bibliotecas
- tipos (um pouco)
mas quais são os mais sutis? Existe algo que um codificador JavaScript levaria como certo que funciona em Lua apenas um pouco diferente? Existem armadilhas que podem não ser óbvias para o codificador experiente de um idioma que tenta o outro?
Por exemplo: em Lua, matrizes e hashes não são separados (existem apenas tabelas) - em JavaScript, eles são matrizes numéricas e objetos com hash. Bem, essa é uma das diferenças mais óbvias.
Mas existem diferenças no escopo variável, imutabilidade ou algo assim?
fonte
Respostas:
Mais algumas diferenças:
===
e!==
não digite malabarismo.^
); JS não. JS utiliza operadores diferentes, incluindo o operador condicional ternário (?:
vsand/or
), e, a partir de 5.3, operadores de bits (&
,|
, etc. vs metamétodos ).**
.typeof
einstanceof
), operadores de designação adicionais e operadores de comparação adicionais.==
,===
,!=
e!==
os operadores são de preferência menor do que>
,>=
,<
,<=
. Em Lua, todos os operadores de comparação têm a mesma precedência .getfenv
esetfenv
em Lua 5.1 ou_ENV
em Lua 5.2 e 5.3 .Foreach
no JS faz um loop sobre as propriedades do objeto. O Foreach em Lua (que usa a palavra-chavefor
) faz um loop sobre os iteradores e é mais geral.Array
. Estes podem ser repetidos com afor...of
sintaxe. Para objetos regulares, é possível implementar suas próprias funções de iterador. Isso o aproxima muito de Lua.JS tem escopo global e de função. Lua tem escopo global e de bloco . As estruturas de controle (por exemplo
if
,for
,while
) introduzir novos blocos .Devido a diferenças nas regras de escopo, a referência de fechamento de uma variável externa (chamada "upvalues" na linguagem Lua) pode ser tratada de maneira diferente em Lua e em Javascript . Isso geralmente ocorre com fechamentos em
for
loops e pega algumas pessoas de surpresa. Em Javascript , o corpo de umfor
loop não apresenta um novo escopo; portanto, todas as funções declaradas no corpo do loop referenciam as mesmas variáveis externas . Em Lua, cada iteração dofor
loop cria novas variáveis locais para cada variável do loop.O código acima é equivalente a:
Como conseqüência, as funções definidas em iterações separadas têm valores superiores diferentes para cada variável de loop referenciada. Veja também as respostas de Nicolas Bola para Implementação de fechamentos em Lua? e " Quais são as semânticas corretas de um fechamento sobre uma variável de loop? " e " A semântica do genérico para ".
UPDATE : JS agora tem escopo de bloco. Variáveis definidas com
let
ouconst
respeitam o escopo do bloco."pâté".toUpperCase()
("PÂTÉ"
). Lua 5.3 e superior têm seqüências de escape de ponto de código Unicode em literais de cadeia de caracteres (com a mesma sintaxe que as seqüências de escape de ponto de código JavaScript), bem como autf8
biblioteca interna, que fornece suporte básico para a codificação UTF-8(como codificar pontos de código em UTF-8 e decodificar UTF-8 em pontos de código, obter o número de pontos de código em uma string e iterar sobre pontos de código). Strings em Lua são sequências de bytes individuais e podem conter texto em qualquer codificação ou dados binários arbitrários. Lua não possui nenhuma função interna que use dados Unicode; o comportamento destring.upper
depende da localidade C.not
,or
,and
palavras-chave são usadas no lugar de JS s'!
,||
,&&
.~=
para "diferente de", enquanto JS usa!==
. Por exemploif foo ~= 20 then ... end
,.~
XOR bit a bit binário, enquanto JS usa^
.nil
eNaN
) pode ser usado para indexar uma tabela. No JavaScript , todos os tipos que não são de seqüência de caracteres (exceto o símbolo) são convertidos em seqüências de caracteres antes de serem usados para indexar um objeto. Por exemplo, após a avaliação do código a seguir, o valorobj[1]
será"string one"
em JavaScript, mas"number one"
em Lua:obj = {}; obj[1] = "number one"; obj["1"] = "string one";
.if
,while
edo while
declarações, mas Lua não faz emif
,while
erepeat until
declarações. Por exemplo,if (x = 'a') {}
é JS válido, masif x = 'a' do end
é Lua inválido.local function() end
,function t.fieldname() end
,function t:methodname() end
). JS os declara com um sinal de igual (let funcname = function optionalFuncname() {}
,objectname.fieldname = function () {}
).fonte
~=
pode provocar erros sutis . Pode provocar erros de sintaxe , mas eles não são nada sutis.Algumas diferenças sutis que o capturam pelo menos uma vez:
~=
em Lua. Em JS é!=
a:foo()
vez dea.foo()
†† você pode usar um período se quiser, mas precisa passar a
self
variável explicitamente.a.foo(a)
parece um pouco pesado. Veja Programando em Lua para detalhes.fonte
†
para a anotação faz parecer quea.foo()
morreu xDPara ser sincero, seria mais fácil listar as coisas comuns ao Javascript e Lua do que listar as diferenças. Ambas são linguagens de script de tipo dinâmico, mas isso é o mais longe possível. Eles têm uma sintaxe totalmente diferente, diferentes objetivos de design original, diferentes modos de operação (Lua é sempre compilado no bytecode e executado na Lua VM, o Javascript varia), a lista continua.
fonte
prototype
objetos de palavra - chave ou nomeação de objetos, apesar do fato de serem exatamente essas tabelas lua), com funções de cidadão de primeira classe, apesar de não serem funcionais no sentido tradicional (imutabilidade , desenvolvimento declarativo etc.),Matrizes e objetos JavaScript estão mais próximos do que você imagina. Você pode usar a notação de matriz para obter os elementos de qualquer um deles e adicionar índices não numéricos às matrizes. Elementos individuais da matriz podem conter qualquer coisa, e a matriz pode ser esparsa. Eles são primos quase idênticos.
fonte
Em cima da minha cabeça
Lua ...
fonte
Gostei desta pergunta e das respostas fornecidas. Razões adicionais para as duas línguas parecerem mais parecidas comigo:
Ambos atribuem funções a variáveis, podem criar funções rapidamente e definir fechamentos.
fonte
Lua e JavaScript são linguagens básicas de protótipo.
fonte
Um teste revela que o Javascript atual também retorna objetos, ou pelo menos seqüências de caracteres de expressões lógicas como lua:
fonte