Po prostu uwielbiam JavaScript. Jest taki elegancki (wyobraź sobie cichy dźwięk westchnienia zakochanego fanboya w tle).
Tak więc ostatnio grałem z Lua przez framework löve2d (fajnie!) - i myślę, że Lua też jest świetny. Tak, jak ja to widzę, te dwa języki są bardzo podobne.
Są na przykład oczywiste różnice
- składnia
- problematyczna domena
- biblioteki
- typy (trochę)
ale które są bardziej subtelne? Czy jest coś, co koder JavaScript wziąłby za pewnik, co działa w Lua tylko trochę inaczej? Czy są jakieś pułapki, które mogą nie być oczywiste dla doświadczonego programisty jednego języka próbującego drugiego?
Na przykład: w Lua tablice i hashe nie są oddzielne (są tylko tabele) - w JavaScript są to tablice numeryczne i haszowane obiekty. Cóż, jest to jedna z bardziej oczywistych różnic.
Ale czy są różnice w zmiennym zakresie, niezmienności lub czymś w tym rodzaju?
źródło
Odpowiedzi:
Jeszcze kilka różnic:
===
i!==
nie wpisuj juggle.^
); JS tego nie robi. JS używa różnych operatorów w tym trójskładnikowego operatora warunkowego (?:
vsand/or
), oraz od 5,3, bitowe operatorów (&
,|
itp porównaniu metamethods ).**
.typeof
iinstanceof
), dodatkowe operatory przypisania i dodatkowe operatory porównania.==
,===
,!=
a!==
operatorzy mają niższy priorytet niż>
,>=
,<
,<=
. W Lua wszystkie operatory porównania mają ten sam priorytet .getfenv
isetfenv
w Lua 5.1 lub_ENV
w Lua 5.2 i 5.3 .Foreach
w pętlach JS nad właściwościami obiektu. Foreach w Lua (które używają słowa kluczowegofor
) przechodzi przez iteratory i jest bardziej ogólne.Array
. Można je zapętlić za pomocąfor...of
składni. W przypadku zwykłych obiektów można zaimplementować własne funkcje iteratora. To znacznie zbliża go do Lua.JS ma zasięg globalny i funkcjonalny. Lua ma zasięg globalny i blokowy . Struktury sterujące (np
if
,for
,while
) wprowadzenie nowych bloków .Ze względu na różnice w regułach określania zakresu odwołanie zamknięcia do zmiennej zewnętrznej (zwanej „wyższymi wartościami” w języku Lua) może być obsługiwane inaczej w Lua i Javascript . Jest to najczęściej spotykane w przypadku zamykania
for
pętli i zaskakuje niektórych. W JavaScript , treśćfor
pętli nie wprowadza nowego zakresu, więc wszystkie funkcje zadeklarowane w treści pętli odwołują się do tych samych zmiennych zewnętrznych . W Lua każda iteracjafor
pętli tworzy nowe zmienne lokalne dla każdej zmiennej pętli.Powyższy kod jest równoważny z:
W konsekwencji funkcje zdefiniowane w oddzielnych iteracjach mają różne wartości wyższe dla każdej zmiennej pętli, do której się odwołuje. Zobacz także odpowiedzi Nicolasa Boli na wdrażanie zamknięć w Lua? oraz „ Jaka jest poprawna semantyka domknięcia zmiennej pętli? ” oraz „ Semantyka rodzaju ogólnego dla ”.
UPDATE : JS ma teraz zasięg blokowy. Zmienne zdefiniowane w ramach bloku
let
lub uwzględniające jegoconst
zakres."pâté".toUpperCase()
("PÂTÉ"
). Lua 5.3 i nowsze mają sekwencje ucieczki punktów kodowych Unicode w literałach łańcuchowych (z taką samą składnią jak sekwencje specjalne punktów kodowych JavaScript), a także wbudowanąutf8
bibliotekę, która zapewnia podstawowe wsparcie dla kodowania UTF-8(takie jak kodowanie punktów kodowych do UTF-8 i dekodowanie UTF-8 do punktów kodowych, pobieranie liczby punktów kodowych w ciągu i iterowanie po punktach kodowych). Łańcuchy w Lua to sekwencje pojedynczych bajtów i mogą zawierać tekst w dowolnym kodowaniu lub dowolne dane binarne. Lua nie ma żadnych wbudowanych funkcji, które używają danych Unicode; zachowaniestring.upper
zależy od ustawień regionalnych C.not
,or
,and
słowa kluczowe są używane zamiast JS S”!
,||
,&&
.~=
dla „nierównych”, podczas gdy JS używa!==
. Na przykładif foo ~= 20 then ... end
.~
binarnego bitowego XOR, podczas gdy JS używa^
.nil
iNaN
). W JavaScript wszystkie typy niebędące łańcuchami (z wyjątkiem Symbol) są konwertowane na łańcuchy przed użyciem do indeksowania obiektu. Na przykład, po ocenie poniższego kodu wartośćobj[1]
będzie"string one"
w JavaScript, ale"number one"
w Lua:obj = {}; obj[1] = "number one"; obj["1"] = "string one";
.if
,while
orazdo while
sprawozdań, ale nie w Luaif
,while
orazrepeat until
oświadczenia. Na przykładif (x = 'a') {}
jest poprawnym JS, aleif x = 'a' do end
nieprawidłowym Lua.local function() end
,function t.fieldname() end
,function t:methodname() end
). JS deklaruje je za pomocą znaku równości (let funcname = function optionalFuncname() {}
,objectname.fieldname = function () {}
).źródło
~=
można prowokować subtelne błędy. Może powodować błędy składniowe , ale nie są one wcale subtelne.Kilka subtelnych różnic, które przynajmniej raz Cię złapią:
~=
w Lua. W JS to jest!=
a:foo()
zamiasta.foo()
†† jeśli chcesz, możesz użyć kropki, ale musisz
self
jawnie przekazać zmienną.a.foo(a)
wygląda trochę nieporęcznie. Szczegółowe informacje można znaleźć w części Programowanie w Lua .źródło
†
adnotacji sprawia, że wygląda na to, żea.foo()
umarł xDSzczerze mówiąc, łatwiej byłoby wymienić rzeczy, które są wspólne dla Javascript i Lua, niż wymienić różnice. Oba są dynamicznie wpisywanymi językami skryptowymi, ale to tak naprawdę wszystko. Mają zupełnie inną składnię, różne pierwotne cele projektowe, różne tryby działania (Lua jest zawsze kompilowana do kodu bajtowego i uruchamiana na maszynie wirtualnej Lua, JavaScript jest różna), lista jest długa.
źródło
prototype
lub nazywania obiektów obiektów, mimo że dokładnie tym są tabele Lua), z funkcjami jako obywatelami pierwszej klasy, mimo że nie są funkcjonalne w tradycyjnym sensie (niezmienność , rozwój deklaratywny itp.),Tablice i obiekty JavaScript są bliżej, niż mogłoby się wydawać. Możesz użyć notacji tablicowej, aby uzyskać dostęp do elementów dowolnego z nich, a także możesz dodać nieliczbowe indeksy do tablic. Poszczególne elementy tablicy mogą zawierać wszystko, a tablica może być rzadka. Są prawie identycznymi kuzynami.
źródło
Z czubka mojej głowy
Lua ...
źródło
Podobało mi się to pytanie i udzielone odpowiedzi. Dodatkowe powody, dla których te dwa języki wydają mi się bardziej podobne niż nie:
Oba przypisują funkcje do zmiennych, mogą budować funkcje w locie i definiować domknięcia.
źródło
Lua i JavaScript są prototypowymi językami bazowymi.
źródło
Test ujawnia, że obecny JavaScript zwraca również obiekty, a przynajmniej ciągi z wyrażeń logicznych, takich jak lua:
źródło