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?

Author: P̲̳x͓L̳, 2009-06-21

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 (?: vs and/or), a od wersji 5.3 operatory bitowe (&, |, itd. vs. metametody ).
    • UPDATE : JS ma teraz operator wykładniczy **.
  • js ma operatory increment/decrement, type (typeof i instanceof), 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 .
  • 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 oraz setfenv 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 kluczowego for) 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ładni for...of. Dla zwykłych obiektów można zaimplementować własne funkcje iteratora. To przybliża go do Lua.
  • 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ętli for 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 lub const 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ład if 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 i NaN) 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, i do while wypowiedzi, ale Lua Nie w if, while, i repeat until wypowiedzi. Na przykład, if (x = 'a') {} jest poprawne JS, ale if 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 () {}).
 171
Author: outis,
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.

 12
Author: DaveR,
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() zamiast a.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.

 10
Author: richq,
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.

 7
Author: Nosredna,
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 ...

  1. podpory koroutines
  2. nie ma ograniczenia do tylko string / number jako klucz tabeli. Wszystko działa.
  3. obsługa błędów jest nieco niezdarna. Albo nie zajmujesz się niczym, albo używasz metody pcall
  4. myślę, że czytałem coś o różnicach w zakresie leksykalnym i że Lua ma lepszy.
  5. Jeśli dobrze pamiętam obsługa wyrażeń regularnych w lua to limited
 3
Author: jitter,
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.

 3
Author: WeakPointer,
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();
 1
Author: Adder,
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

Lua i JavaScript są prototypowymi językami bazowymi.

 0
Author: ,
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-07-03 09:21:20