J'adore tout 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 (sympa!) - et je pense que Lua est également génial. Selon moi, ces deux langues sont très similaires.
Il existe des différences évidentes, comme
- syntaxe
- domaine de problème
- bibliothèques
- types (un peu)
mais quels sont les plus subtils? Y a-t-il quelque chose qu'un codeur JavaScript prendrait pour acquis qui fonctionne légèrement différemment dans Lua? Y a-t-il des écueils qui ne sont peut-être pas é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?
la source
Réponses:
Quelques autres différences:
===
et!==
ne tapez pas jongler.^
); JS ne le fait pas. JS utilise des opérateurs différents, y compris l'opérateur conditionnel ternaire (?:
vsand/or
), et, de 5.3, les opérateurs ( au niveau du bit&
,|
etc. contre métaméthodes ).**
.typeof
etinstanceof
), des opérateurs d'affectation supplémentaires et des opérateurs de comparaison supplémentaires.==
,===
,!=
et les!==
opérateurs sont de priorité inférieur>
,>=
,<
,<=
. Dans Lua, tous les opérateurs de comparaison ont la même priorité .getfenv
etsetfenv
dans Lua 5.1 ou_ENV
dans Lua 5.2 et 5.3 .Foreach
dans JS boucle sur les propriétés de l'objet. Foreach dans Lua (qui utilise le mot-cléfor
) boucle sur les itérateurs et est plus général.Array
. Ceux-ci peuvent être bouclés avec lafor...of
syntaxe. Pour les objets normaux, 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 une portée globale et de bloc . Les structures de contrôle (par exemple
if
,for
,while
) introduisent de nouveaux blocs .En raison des différences dans les règles de cadrage, le référencement d'une variable externe (appelée "upvalues" en langage Lua) peut être géré différemment en Lua et en Javascript . Cela se produit le plus souvent avec des fermetures en
for
boucle , et prend certaines personnes par surprise. En Javascript , le corps d'unefor
boucle n'introduit pas de nouvelle portée, donc toutes les fonctions déclarées dans le corps de la boucle font toutes référence aux mêmes variables externes . Dans Lua, chaque itération de lafor
boucle crée de nouvelles variables locales pour chaque variable de boucle.Le code ci-dessus est équivalent à:
En conséquence, les fonctions définies dans des itérations séparées ont des valeurs ascendantes différentes pour chaque variable de boucle référencée. Voir aussi les réponses de Nicolas Bola à Implémentation des fermetures à Lua? et " Quelle est la sémantique correcte d'une fermeture sur une variable de boucle? ", et " La sémantique du générique pour ".
MISE À JOUR : JS a maintenant une portée de bloc. Variables définies avec
let
ouconst
respectant la portée du bloc."pâté".toUpperCase()
("PÂTÉ"
). Lua 5.3 et versions ultérieures ont des séquences d'échappement de points de code Unicode dans des chaînes littérales (avec la même syntaxe que les séquences d'échappement de points de code JavaScript) ainsi que lautf8
bibliothèque intégrée, qui fournit un support de base pour l' encodage UTF-8(comme le codage de points de code en UTF-8 et le décodage de 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 encodage ou des données binaires arbitraires. Lua n'a pas de fonctions intégrées qui utilisent des données Unicode; le comportement destring.upper
dépend de la locale C.not
,or
, lesand
mots clés sont utilisés à la place de JS d »!
,||
,&&
.~=
pour "pas égal", alors que JS utilise!==
. Par exempleif foo ~= 20 then ... end
,.~
pour XOR binaire bit à bit, alors que JS utilise^
.nil
etNaN
) peut être utilisé pour indexer une table. En JavaScript , tous les types non-chaîne (à l'exception de Symbol) sont convertis en chaînes avant d'être utilisés pour indexer un objet. Par exemple, après évaluation du code ci - dessous, la valeurobj[1]
sera"string one"
en JavaScript, mais"number one"
dans Lua:obj = {}; obj[1] = "number one"; obj["1"] = "string one";
.if
,while
et desdo while
déclarations, mais ne pas Luaif
,while
et desrepeat until
déclarations. Par exemple,if (x = 'a') {}
est un JS valide, maisif x = 'a' do end
est un Lua non 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 () {}
).la source
~=
provoquer des bugs subtils . Cela peut provoquer des erreurs de syntaxe , mais elles ne sont pas du tout subtiles.Quelques différences subtiles qui vous surprendront au moins une fois:
~=
en Lua. Dans JS c'est!=
a:foo()
au lieu dea.foo()
†† vous pouvez utiliser un point si vous le souhaitez, mais devez passer la
self
variable explicitement.a.foo(a)
semble un peu encombrant. Voir Programmation en Lua pour plus de détails.la source
†
pour l'annotation donne l'impression d'êtrea.foo()
mort xDPour être honnête, il serait plus facile de lister les choses qui sont communes à Javascript et Lua que de lister les différences. Ce sont tous les deux des langages de script à typage dynamique, mais c'est à peu près tout ce que vous pouvez vraiment aller. Ils ont une syntaxe totalement différente, des objectifs de conception originaux différents, des modes de fonctionnement différents (Lua est toujours compilé en bytecode et exécuté sur la machine virtuelle Lua, Javascript varie), la liste s'allonge encore et encore.
la source
prototype
- clés ou de nommer des objets, malgré le fait que c'est exactement ce que sont les tables lua), avec des fonctions de citoyen de première classe bien qu'elles ne soient pas fonctionnelles au sens traditionnel (immutablilité , développement déclaratif etc.),Les tableaux et objets JavaScript sont plus proches que vous ne le pensez. Vous pouvez utiliser la notation de tableau pour obtenir les éléments de l'un ou l'autre d'entre 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 fragmenté. Ce sont des cousins presque identiques.
la source
Du haut de ma tête
Lua ...
la source
J'ai aimé cette question et les réponses fournies. Raisons supplémentaires pour lesquelles les deux langues me semblent plus semblables que pas:
Les deux affectent des fonctions à des variables, peuvent créer des fonctions à la volée et définir des fermetures.
la source
Lua et JavaScript sont tous deux des langages de base prototypes.
la source
Un test révèle que le Javascript actuel renvoie également des objets, ou au moins des chaînes d'expressions logiques comme le fait lua:
la source