subtelne różnice między JavaScript i Lua
Po prostu kocham JavaScript. Jest tak elegancki (wyobraź sobie cichy dźwięk westchnienia fanboya lovestruck w tle).
Tak, ostatnio grałem z Lua przez löve2d framework (nice!)- i myślę, że Lua też jest świetna. Jak ja to widzę, te dwa języki są bardzo podobne.
Istnieją oczywiste różnice, jak
- składnia
- problem domeny
- biblioteki
- typy (bit)
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 istnieją 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 hasze nie są oddzielne (są tylko tabele) - w JavaScript są to tablice numeryczne i Obiekty haszowane. To jedna z bardziej oczywistych różnic.
Ale czy są różnice w zakresie zmiennych, niezmienność czy coś w tym stylu?
8 answers
Więcej różnic:
-
[[67]} Lua ma natywne wsparcie dla coroutines .
- UPDATE : JS zawiera teraz słowo kluczowe yield wewnątrz generatorów, dając wsparcie dla coroutines.
-
Lua nie konwertuje pomiędzy typami dla żadnych operatorów porównania. W JS tylko
===
i!==
nie wpisują żonglerki. -
Lua ma operator wykładniczy (
^
); JS nie. JS używa różnych operatorów, w tym trójdzielnego operatora warunkowego (?:
vsand/or
), a od wersji 5.3 operatory bitowe (&
,|
, itd. vs. metametody ).-
UPDATE : JS ma teraz operator wykładniczy
**
.
-
UPDATE : JS ma teraz operator wykładniczy
-
js ma operatory increment/decrement, type (
typeof
iinstanceof
), dodatkowe operatory przypisania i dodatkowe operatory porównania. - In JS , the
==
,===
,!=
i!==
operatory mają niższy priorytet niż>
,>=
,<
,<=
. W Lua wszystkie operatory porównania są tym samym pierwszeństwem . -
Lua obsługuje wywołania ogonowe .
- UPDATE : JS now obsługuje wywołania ogonowe .
-
Lua obsługuje przypisanie do listy zmiennych . Chociaż nie jest to jeszcze standard w Javascript , silnik js Mozilli (i Opera, do od wersji js 1.7 (dostępnej jako część Firefoksa 2), program obsługuje podobną funkcję pod nazwą " destructuring assignment ". Destrukcja w JS jest bardziej ogólna, ponieważ może być używana w kontekstach innych niż przypisanie, takich jak definicje funkcji i wywołania i inicjalizatory pętli. przypisanie destrukcji było proponowanym dodatkiem do ECMAScript (standardu języka JavaScript) przez jakiś czas.
- UPDATE : Destrukcja (i przypisanie destrukcji) jest obecnie częścią specyfikacji ECMAScript-zaimplementowanej już w wielu silnikach.
- w Lua można przeciążać operatory .
- w Lua , można manipulować środowiskami za pomocą
getfenv
orazsetfenv
w Lua 5.1 lub_ENV
w Lua 5.2 oraz 5.3. - w JS wszystkie funkcje są zmienne. W Lua, funkcje muszą być jawnie zadeklarowana jako zmienna .
-
Foreach
w JS pętli nad właściwościami obiektu. Foreach inLua (które używają słowa kluczowegofor
) pętli nad iteratorami i jest bardziej ogólne.-
UPDATE : JS ma również Iterables, z których wiele jest wbudowanych w zwykłe struktury danych, których można się spodziewać, takie jak
Array
. Można je zapętlić za pomocą składnifor...of
. Dla zwykłych obiektów można zaimplementować własne funkcje iteratora. To przybliża go do Lua.
-
UPDATE : JS ma również Iterables, z których wiele jest wbudowanych w zwykłe struktury danych, których można się spodziewać, takie jak
-
JS ma zasięg globalny i funkcyjny. Lua mazasięg globalny i blokowy . Struktury kontrolne (np.
if
,for
,while
) wprowadź nowe bloki .-
Ze względu na różnice w regułach zakresów, odwołanie do zewnętrznej zmiennej (zwanej "wartościami dodatkowymi" w języku Lua) może być obsługiwane inaczej w Lua i wJavascript . Jest to najczęściej doświadczane z zamknięcia w
for
pętli i łapie niektórych ludzi z zaskoczenia. W Javascript ciało pętlifor
nie wprowadza nowego zakresu, więc wszystkie funkcje zadeklarowane w ciele pętli odwołują się do tych samych zewnętrznych zmiennych. W Lua każda iteracja pętli {[24] } tworzy nowe zmienne lokalne dla każdej zmiennej pętli.local i='foo' for i=1,10 do -- "i" here is not the local "i" declared above ... end print(i) -- prints 'foo'
Powyższy kod jest równoważny:
local i='foo' do local _i=1 while _i<10 do local i=_i ... _i=_i+1 end end print(i)
W konsekwencji funkcje zdefiniowane w oddzielnych iteracjach mają różne wartości dla każdej zmiennej pętli odniesienia. Zobacz także odpowiedzi Nicolasa Bola na implementacja zamknięć w Lua? i "jakie są poprawne semantyki zamknięcia nad zmienną pętli?[[70]}" i "semantyka Generyka dla ".
UPDATE: JS ma teraz zasięg bloku. Zmienne zdefiniowane za pomocą
let
lubconst
respektują zakres bloku.
-
- literały całkowite wJS mogą być w ósemce.
- JS posiada wyraźne wsparcie dla Unicode.
- In Lua , the
not
,or
,and
słowa kluczowe są używane zamiast JS ' s!
,||
,&&
. -
Lua używa
~=
Dla "Nie równych", podczas gdy JS używa!==
. Na przykładif foo ~= 20 then ... end
. -
Lua 5.3 i up używają
~
dla binarnego bitowego XOR, podczas gdy JS używa^
. - In Lua, dowolny typ wartości (z wyjątkiem
nil
iNaN
) może być użyty do indeksowania tabeli; w JavaScript, wszystkie typy non-string (z wyjątkiem symbolu) są konwertowane na ciągi znaków przed użyciem do indeksowania obiektu. - w JS zadania są traktowane jako wyrażenia, ale w Lua nie są. W ten sposób JS umożliwia zadania w Warunkach
if
,while
, ido while
wypowiedzi, ale Lua Nie wif
,while
, irepeat until
wypowiedzi. Na przykład,if (x = 'a') {}
jest poprawne JS, aleif x = 'a' do end
jest niepoprawne Lua. -
Lua ma składniowy cukier do deklarowania zmienne funkcji o zasięgu blokowym, funkcje będące polami i metody (
local function() end
,function t.fieldname() end
,function t:methodname() end
). js deklaruje je znakiem równości (let funcname = function optionalFuncname() {}
,objectname.fieldname = function () {}
).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-26 22:10:01
Szczerze mówiąc łatwiej byłoby wymienić rzeczy, które są wspólne dla Javascript i Lua, niż wymienić różnice. Oba są dynamicznie typowanymi językami skryptowymi, ale to tak daleko, jak można naprawdę zajść. Mają zupełnie inną składnię, różne oryginalne cele projektowe, różne tryby działania (Lua jest zawsze kompilowany do bajtowego kodu I uruchamiany na maszynie wirtualnej Lua, Javascript jest różny), lista jest długa i długa.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-20 21:48:31
Kilka subtelnych różnic, które złapią cię przynajmniej raz:
- nie równe jest pisane
~=
w Lua. W JS jest!=
- Lua tablice są oparte na 1 - ich pierwszy indeks to 1, a nie 0.
- Lua wymaga dwukropka zamiast kropki do wywoływania metod obiektowych. Piszesz
a:foo()
zamiasta.foo()
†
† możesz użyć kropki, jeśli chcesz, ale musisz jawnie przekazać zmienną self
. a.foo(a)
wygląda trochę uciążliwe. Zobacz Programowanie w Lua Po szczegóły.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-02 14:34:45
Tablice i Obiekty JavaScript są bliżej niż mogłoby się wydawać. Można użyć notacji tablicowej, aby uzyskać na elementach każdego z nich, a do tablic można dodawać nieliczbowe indeksy. Poszczególne elementy tablicy mogą pomieścić wszystko, a tablica może być rzadka. Są prawie identycznymi kuzynami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-20 22:15:01
Off the top of my head
Lua ...
- podpory koroutines
- nie ma ograniczenia do tylko string / number jako klucz tabeli. Wszystko działa.
- obsługa błędów jest nieco niezdarna. Albo nie zajmujesz się niczym, albo używasz metody pcall
- myślę, że czytałem coś o różnicach w zakresie leksykalnym i że Lua ma lepszy.
- Jeśli dobrze pamiętam obsługa wyrażeń regularnych w lua to limited
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-20 22:11:22
Podobało mi się to pytanie i udzielone odpowiedzi. Dodatkowe powody, dla których oba języki wydają mi się bardziej podobne niż nie:
Obie przypisywanie funkcji do zmiennych, potrafi budować funkcje w locie, i zdefiniuj zamknięcia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-22 08:09:28
Test ujawnia, że obecny Javascript zwraca również obiekty, lub przynajmniej ciągi znaków z wyrażeń logicznych, takich jak Lua:
function nix(){
alert(arguments[0]||"0");
}
nix();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-17 11:59:05