J'adore simplement JavaScript. C'est tellement élégant (imaginez le son calme d'un fanboy amoureux qui soupire en arrière-plan).
Donc, récemment, j'ai joué avec Lua via le framework löve2d (Nice!) - et je pense que Lua est également génial. À mon avis, ces deux langues sont très très similaires.
Il y a des différences évidentes, comme
mais quels sont les plus subtils? Y a-t-il quelque chose qu'un codeur JavaScript prendrait pour acquis qui fonctionne dans Lua juste légèrement différent? Y a-t-il des écueils qui peuvent ne pas être évidents pour le codeur expérimenté d'une langue essayant l'autre?
Par exemple: dans Lua, les tableaux et les hachages ne sont pas séparés (il n'y a que des tableaux) - en JavaScript, ce sont des tableaux numériques et des objets hachés. Eh bien, c'est l'une des différences les plus évidentes.
Mais y a-t-il des différences de portée variable, d'immuabilité ou quelque chose comme ça?
Quelques différences supplémentaires:
===
Et !==
Ne tapent pas jongler.^
); [~ # ~] js [~ # ~] non. [~ # ~] js [~ # ~] utilise différents opérateurs, y compris l'opérateur conditionnel ternaire (?:
vs and/or
), et, à partir de 5.3 , opérateurs au niveau du bit (&
, |
, etc. vs métaméthodes ). **
.typeof
et instanceof
), opérateurs d'affectation supplémentaires et opérateurs de comparaison supplémentaires .==
, ===
, !=
Et !==
les opérateurs ont une priorité inférieure à >
, >=
, <
, <=
. Dans Lua, tous les opérateurs de comparaison sont les même priorité .getfenv
et setfenv
dans Lua 5.1 ou _ENV
Dans - Lua 5.2 et 5. .Foreach
in [~ # ~] js [~ # ~] fait une boucle sur les propriétés des objets. Foreach in Lua (qui utilise le mot clé for
) fait une boucle sur les itérateurs et est plus général. Array
. Ceux-ci peuvent être bouclés avec la syntaxe for...of
. Pour les objets réguliers, on peut implémenter leurs propres fonctions d'itérateur. Cela le rapproche beaucoup plus de Lua.JS a une portée globale et fonctionnelle. Lua a portée globale et bloc . Les structures de contrôle (par exemple if
, for
, while
) introduisent de nouveaux blocs .
En raison de différences dans les règles de portée, le référencement d'une fermeture d'une variable externe (appelée "upvalues" dans le langage Lua) peut être géré différemment dans Lua et dans Javascript. Cela se produit le plus souvent avec fermetures dans les boucles for
, et surprend certaines personnes par surprise. Dans Javascript, le corps d'une boucle for
n'introduit pas de nouvelle portée, donc toutes les fonctions déclarées dans le corps de la boucle référencent toutes les mêmes variables externes . Dans Lua, chaque itération de la boucle for
crée de nouvelles variables locales pour chaque variable de boucle.
local i='foo'
for i=1,10 do
-- "i" here is not the local "i" declared above
...
end
print(i) -- prints 'foo'
Le code ci-dessus est équivalent à:
local i='foo'
do
local _i=1
while _i<10 do
local i=_i
...
_i=_i+1
end
end
print(i)
Par conséquent, les fonctions définies dans des itérations distinctes ont des valeurs de hausse différentes pour chaque variable de boucle référencée. Voir aussi les réponses de Nicolas Bola à Implémentation des fermetures dans Lua? et " Quelle est la sémantique correcte d'une fermeture sur une variable de boucle? ", et " Le Sémantique du générique pour ".
[~ # ~] mise à jour [~ # ~] : JS a maintenant une portée de bloc. Les variables définies avec let
ou const
respectent la portée du bloc.
"pâté".toUpperCase()
("PÂTÉ"
). Lua 5.3 et plus ont des séquences d'échappement de point de code Unicode dans des littéraux de chaîne (avec la même syntaxe que les séquences d'échappement de point de code JavaScript) ainsi que la bibliothèque utf8
Intégrée, qui fournit une prise en charge de base pour encodage UTF-8 (comme le codage de points de code en UTF-8 et le décodage d'UTF-8 en points de code, l'obtention du nombre de points de code dans une chaîne et l'itération sur des points de code ). Les chaînes en Lua sont des séquences d'octets individuels et peuvent contenir du texte dans n'importe quel codage ou des données binaires arbitraires. Lua n'a pas de fonctions intégrées qui utilisent des données Unicode; le comportement de string.upper
dépend des paramètres régionaux C.not
, or
, and
sont utilisés à la place de [~ # ~] js [ ~ # ~]'s !
, ||
, &&
.~=
Pour "différent", tandis que [~ # ~] js [~ # ~] utilise !==
. Par exemple, if foo ~= 20 then ... end
.~
Pour XOR binaire au niveau du bit, tandis que [~ # ~] js [~ # ~] utilise ^
.nil
et NaN
) peut être utilisé pour indexer une table. Dans JavaScript, tous les types non-chaîne (sauf Symbol) sont convertis en chaînes avant d'être utilisés pour indexer un objet. Par exemple, après évaluation du code suivant, la valeur de obj[1]
Sera "string one"
En JavaScript, mais "number one"
En Lua: obj = {}; obj[1] = "number one"; obj["1"] = "string one";
.if
, while
et do while
, Mais Lua ne le fait pas dans if
, while
, et les instructions repeat until
. Par exemple, if (x = 'a') {}
est JS valide, mais if x = 'a' do end
N'est pas Lua valide.local function() end
, function t.fieldname() end
, function t:methodname() end
). [~ # ~] js [~ # ~] les déclare avec un signe égal (let funcname = function optionalFuncname() {}
, objectname.fieldname = function () {}
).Quelques différences subtiles qui vous rattraperont au moins une fois:
~=
En Lua. Dans JS, c'est !=
a:foo()
au lieu de a.foo()
†† vous pouvez utiliser un point si vous le souhaitez, mais vous devez passer explicitement la variable self
. a.foo(a)
semble un peu lourd. Voir Programmation en Lua pour plus de détails.
Pour être honnête, il serait plus facile d'énumérer les choses qui sont communes à Javascript et Lua que d'énumérer les différences. Ce sont deux langages de script à typage dynamique, mais c'est à peu près aussi loin que vous pouvez vraiment aller. Ils ont une syntaxe totalement différente, différents objectifs de conception d'origine, différents modes de fonctionnement (Lua est toujours compilé en bytecode et exécuté sur la machine virtuelle Lua, Javascript varie), la liste s'allonge encore et encore.
Les tableaux et objets JavaScript sont plus proches que vous ne le pensez. Vous pouvez utiliser la notation de tableau pour accéder aux éléments de l'un d'eux et vous pouvez ajouter des indices non numériques aux tableaux. Les éléments de tableau individuels peuvent contenir n'importe quoi et le tableau peut être clairsemé. Ce sont des cousins presque identiques.
J'ai aimé cette question et les réponses fournies. Des raisons supplémentaires pour lesquelles les deux langues me semblent plus que similaires:
Les deux affectent des fonctions aux variables, peuvent créer des fonctions à la volée et définir des fermetures.
Du haut de ma tête
Lua ...
Un test révèle que le Javascript actuel renvoie également des objets, ou du moins des chaînes d'expressions logiques comme lua:
function nix(){
alert(arguments[0]||"0");
}
nix();
Lua et JavaScript sont tous deux des langages de base prototypes.