Ich liebe einfach JavaScript. Es ist so elegant (stellen Sie sich das leise Geräusch eines verliebten Fanboys vor, der im Hintergrund seufzt).
Also habe ich kürzlich mit Lua über das löve2d Framework gespielt (nett!) - und ich finde Lua auch großartig. So wie ich es sehe, sind diese beiden Sprachen sehr ähnlich.
Es gibt offensichtliche Unterschiede wie
- Syntax
- Problemdomäne
- Bibliotheken
- Typen (ein bisschen)
aber welche sind die subtileren? Gibt es etwas, das ein JavaScript-Codierer für selbstverständlich hält und das in Lua nur geringfügig anders funktioniert? Gibt es Fallstricke, die für den erfahrenen Programmierer einer Sprache, die die andere versucht, möglicherweise nicht offensichtlich sind?
Beispiel: In Lua sind Arrays und Hashes nicht getrennt (es gibt nur Tabellen). In JavaScript handelt es sich um numerische Arrays und Hash-Objekte. Nun, dies ist einer der offensichtlicheren Unterschiede.
Aber gibt es Unterschiede in Bezug auf variablen Umfang, Unveränderlichkeit oder ähnliches?
quelle
Antworten:
Einige weitere Unterschiede:
===
und!==
nicht Jonglieren.^
); JS nicht. JS verwendet verschiedene Operatoren, einschließlich der ternären bedingten Operator (?:
vsand/or
), und, wie von 5,3, Bitoperatoren (&
,|
usw. vs. metamethods ).**
.typeof
undinstanceof
), zusätzliche Zuweisungsoperatoren und zusätzliche Vergleichsoperatoren.==
,===
,!=
und!==
Betreiber von niedrigerer Priorität als>
,>=
,<
,<=
. In Lua haben alle Vergleichsoperatoren die gleiche Priorität .getfenv
undsetfenv
in Lua 5.1 oder_ENV
in Lua 5.2 und 5.3 bearbeiten .Foreach
in JS Schleifen über Objekteigenschaften. Foreach in Lua (die das Schlüsselwort verwendenfor
) durchläuft Iteratoren und ist allgemeiner.Array
. Diese können mit derfor...of
Syntax durchlaufen werden. Für reguläre Objekte kann man eigene Iteratorfunktionen implementieren. Dies bringt es Lua viel näher.JS hat einen globalen und Funktionsumfang. Lua hat globalen und Blockbereich . Kontrollstrukturen (zB
if
,for
,while
) die Einführung neuer Blöcke .Aufgrund unterschiedlicher Bereichsregeln kann die Referenzierung einer äußeren Variablen durch einen Abschluss (im Lua-Sprachgebrauch als "Upvalues" bezeichnet) in Lua und in Javascript unterschiedlich behandelt werden . Dies tritt am häufigsten bei Verschlüssen in
for
Schleifen auf und überrascht einige Menschen. In Javascript führt der Hauptteil einerfor
Schleife keinen neuen Bereich ein, sodass alle im Schleifenkörper deklarierten Funktionen auf dieselben äußeren Variablen verweisen . In Lua erstellt jede Iteration derfor
Schleife neue lokale Variablen für jede Schleifenvariable.Der obige Code entspricht:
Infolgedessen haben Funktionen, die in separaten Iterationen definiert sind, unterschiedliche Aufwärtswerte für jede referenzierte Schleifenvariable. Siehe auch Nicolas Bolas Antworten auf die Umsetzung von Schließungen in Lua? und " Was ist die korrekte Semantik eines Abschlusses über eine Schleifenvariable? " und " Die Semantik des Generikums für ".
UPDATE : JS hat jetzt einen Blockbereich. Variablen, die mit dem Blockumfang definiert sind
let
oder diesenconst
respektieren."pâté".toUpperCase()
("PÂTÉ"
). Lua 5.3 und höher verfügen über Unicode-Codepunkt-Escape-Sequenzen in String-Literalen (mit derselben Syntax wie JavaScript-Codepunkt-Escape-Sequenzen) sowie über die integrierteutf8
Bibliothek, die grundlegende Unterstützung für die UTF-8-Codierung bietet(z. B. Codieren von Codepunkten in UTF-8 und Decodieren von UTF-8 in Codepunkte, Abrufen der Anzahl der Codepunkte in einer Zeichenfolge und Durchlaufen von Codepunkten). Strings in Lua sind Sequenzen einzelner Bytes und können Text in beliebiger Codierung oder beliebigen Binärdaten enthalten. Lua verfügt über keine integrierten Funktionen, die Unicode-Daten verwenden. Das Verhalten vonstring.upper
hängt vom Gebietsschema C ab.not
,or
,and
werden anstelle der Schlüsselwörter verwendet JS ‚s!
,||
,&&
.~=
für "ungleich", während JS verwendet!==
. Zum Beispielif foo ~= 20 then ... end
.~
für binäres bitweises XOR, während JS verwendet^
.nil
undNaN
) zum Indizieren einer Tabelle verwendet werden. In JavaScript werden alle Nicht-Zeichenfolgentypen (außer Symbol) in Zeichenfolgen konvertiert, bevor sie zum Indizieren eines Objekts verwendet werden. Nach der Auswertung des folgenden Codes wird der Wert vonobj[1]
beispielsweise"string one"
in JavaScript, aber"number one"
in Lua angegeben :obj = {}; obj[1] = "number one"; obj["1"] = "string one";
.if
,while
unddo while
Aussagen, aber Lua nicht inif
,while
undrepeat until
Aussagen. Zum Beispielif (x = 'a') {}
ist gültiges JS, aberif x = 'a' do end
ungültiges Lua.local function() end
,function t.fieldname() end
,function t:methodname() end
). JS deklariert diese mit einem Gleichheitszeichen (let funcname = function optionalFuncname() {}
,objectname.fieldname = function () {}
).quelle
~=
provozieren können subtile Bugs. Es kann zu Syntaxfehlern führen , die jedoch keineswegs subtil sind.Ein paar subtile Unterschiede, die Sie mindestens einmal bemerken werden:
~=
in Lua geschrieben. In JS ist es!=
a:foo()
statta.foo()
†† Sie können einen Punkt verwenden, wenn Sie möchten, müssen die
self
Variable jedoch explizit übergeben.a.foo(a)
sieht etwas umständlich aus. Weitere Informationen finden Sie unter Programmieren in Lua .quelle
†
a.foo()
Um ehrlich zu sein, wäre es einfacher, die Dinge aufzulisten, die Javascript und Lua gemeinsam haben, als die Unterschiede aufzulisten. Sie sind beide dynamisch typisierte Skriptsprachen, aber das ist ungefähr so weit, wie Sie wirklich gehen können. Sie haben eine völlig andere Syntax, unterschiedliche ursprüngliche Entwurfsziele, unterschiedliche Betriebsmodi (Lua wird immer zu Bytecode kompiliert und auf der Lua-VM ausgeführt, Javascript variiert), die Liste geht weiter und weiter.
quelle
prototype
oder der Benennung von Objekten angegeben wird, obwohl es genau das ist, was Lua-Tabellen sind), mit Funktionen als erstklassiger Bürger, obwohl sie im herkömmlichen Sinne nicht funktionsfähig sind (Unveränderlichkeit) , deklarative Entwicklung usw.),JavaScript-Arrays und -Objekte sind näher als Sie vielleicht denken. Sie können die Array-Notation verwenden, um auf die Elemente eines der beiden Elemente zuzugreifen, und Sie können Arrays nicht numerische Indizes hinzufügen. Einzelne Array-Elemente können alles enthalten, und das Array kann spärlich sein. Sie sind fast identische Cousins.
quelle
Aus meinem Kopf
Lua ...
quelle
Diese Frage und die Antworten haben mir gefallen. Weitere Gründe, warum mir die beiden Sprachen ähnlicher erscheinen als nicht:
Beide weisen Variablen Funktionen zu, können Funktionen im laufenden Betrieb erstellen und Abschlüsse definieren.
quelle
Lua und JavaScript sind beide Prototyp-Basissprachen.
quelle
Ein Test zeigt, dass aktuelles Javascript auch Objekte oder zumindest Zeichenfolgen aus logischen Ausdrücken zurückgibt, wie es lua tut:
quelle