2009-06-20 12 views
111

mi amano semplicemente JavaScript. È così elegante (immagina il suono silenzioso di fan sospirando in sottofondo sullo sfondo).sottili differenze tra JavaScript e Lua

Quindi, recentemente ho suonato con Lua tramite il framework löve2d (bello!) - e penso che anche Lua sia fantastica. A mio modo di vedere, quelle due lingue sono molto simili.

Ci sono differenze evidenti, come

  • sintassi
  • problema del dominio
  • librerie
  • tipi (un po ')

ma che sono quelli più sottili? C'è qualcosa che un programmatore JavaScript dovrebbe dare per scontato che funzioni in Lua solo leggermente diverso? Ci sono delle insidie ​​che potrebbero non essere ovvie al codificatore esperto di una lingua che prova l'altra?

Ad esempio: in Lua, array e hash non sono separati (ci sono solo tabelle) - in JavaScript, sono matrici numeriche e hash oggetti. Bene, questa è una delle differenze più ovvie.

Ma ci sono differenze nella portata variabile, immutabilità o qualcosa di simile?

+15

+1 per "(immaginare il suono tranquillo della lovestruck sospiri fanboy in background)." – UnkwnTech

+8

Per quelli, come me, che stavano cercando un confronto generale e sono finiti qui per caso, la seguente è una bella panoramica: http://phrogz.net/lua/LearningLua_FromJS.html – Tao

+0

Javascript ed elegante non dovrebbero essere nel stessa frase! – Matt

risposta

165

Alcune altre differenze:

  • Lua ha il supporto nativo per coroutines.
    • UPDATE: JS ora contiene la parola resa all'interno generatori, dando supporto per coroutines.
  • Luadoesn't convert tra tipi per qualsiasi operatore di confronto. In JS, solo === e !== non digitare juggle.
  • Lua ha un operatore di esponenziazione (^); JS no. JS utilizza operatori diversi, incluso l'operatore condizionale ternario (?: vs and/or) e, a partire da 5.3, operatori bit a bit (&, |, ecc. Vs. metamethods).
    • UPDATE: JS ora dispone dell'operatore di esponenziazione **.
  • JS trovi incremento/decremento, operatori di tipo (typeof e instanceof), operatori di assegnazione addizionali e operatori di confronto aggiuntivi.
  • In JS, gli operatori ==, ===, != e !== sono di precedenza inferiore >, >=, <, <=. In Lua, tutti gli operatori di confronto sono same precedence.
  • Lua supporta tail calls.
  • Lua supporta assignment to a list of variables. Anche se non è ancora presente nello Javascript, il motore JS di Mozilla (e Opera, in parte) ha supportato una funzionalità simile da JS 1.7 (disponibile come parte di Firefox 2) con il nome "destructuring assignment". La destrutturazione in JS è più generale, in quanto può essere utilizzata in contesti diversi dall'assegnazione, ad esempio function definitions & calls e loop initializers. Destructuring assignment è stato proposto come aggiunta a ECMAScript (lo standard di linguaggio dietro Javascript) per un po '.
    • UPDATE: destrutturazione (e assegnazione destrutturazione) è ora parte della specifica per ECMAScript - già implementata in molti motori.
  • In Lua, è possibile overload operators.
  • In Lua, è possibile manipulate environments con getfenv & setfenv.
  • In JS, tutte le funzioni sono variadiche. In Lua, le funzioni devono essere explicitly declared as variadic.
  • Foreach in JS loop su proprietà dell'oggetto.Foreach in Lua (che utilizza la parola chiave for) loop su iteratori ed è più generale.
    • UPDATE: JS ha Iterables ormai troppo, molti dei quali sono costruiti nelle strutture di dati regolari che ci si aspetta, come ad esempio Array. Questi possono essere ricollegati alla sintassi for...of. Per gli oggetti regolari, è possibile implementare le proprie funzioni di iteratore. Questo lo avvicina molto a Lua.
  • JS ha portata globale e funzione. Lua ha global and block scope. Le strutture di controllo (ad esempio if, for, while) introducono il nuovo blocks.

    • causa di differenze di regole di visibilità, riferimenti di una chiusura di una variabile esterna (chiamati "upvalues" nel gergo Lua) possono essere gestiti in modo diverso in Lua e JavaScript. Questo è più comunemente sperimentato con closures in for loops e sorprende alcune persone. In Javascript, il corpo di un ciclo for non introduce un nuovo ambito, pertanto tutte le funzioni dichiarate nel corpo del ciclo fanno riferimento allo same outer variables. In Lua, ogni iterazione del ciclo for crea nuove variabili locali per ogni variabile di ciclo.

      local i='foo' 
      for i=1,10 do 
          -- "i" here is not the local "i" declared above 
          ... 
      end 
      print(i) -- prints 'foo' 
      

      Il codice sopra è equivalente a:

      local i='foo' 
      do 
          local _i=1 
          while _i<10 do 
          local i=_i 
          ... 
          _i=_i+1 
          end 
      end 
      print(i) 
      

      Di conseguenza, funzioni definite nelle iterazioni includano upvalues ​​differenti per ciascuna variabile loop riferimento. Vedi anche le risposte di Nicolas Bola a Implementation of closures in Lua? e "What are the correct semantics of a closure over a loop variable?" e "The Semantics of the Generic for".

      UPDATE: JS ha ora lo scopo del blocco. Le variabili definite con let o const rispettano l'ambito del blocco.

  • letterali interi JS possono essere in ottale.
  • JS ha il supporto Unicode esplicito.
  • In Lua, ~ viene utilizzato al posto di !. (come in, if foo ~= 20 then ... end) (tecnicamente la sintassi, ma è facilmente trascurata e causa bug sottili).
  • In Lua, le parole chiave not/or/and vengono utilizzate al posto di !/||/&& (anche la sintassi ma anche facilmente dimenticata).
  • In Lua, qualsiasi tipo di valore (eccetto nil e NaN) può essere utilizzato per indicizzare una tabella; in JavaScript, gli indici oggetto vengono convertiti in stringhe.
  • In JS, le assegnazioni sono considerate come espressioni, ma in Lua non lo sono.Pertanto, JS consente assegnazioni in condizioni di if, while e do while dichiarazioni, ma Lua non è in if, while e repeat until dichiarazioni. Ad esempio, if (x = 'a') {} è JS valido, ma if x = 'a' do end non è valido Lua.
+4

in Lua, gli operatori logici (e, o) restituiscono uno degli argomenti. tutte le funzioni possono essere richiamate con qualsiasi numero di parametri; ma sono adeguati al numero necessario (a meno che non si usi ... "extra args") – Javier

+0

grazie, questa è una lista molto bella (ed esattamente quello che speravo). "# In Lua, gli operatori logici restituiscono valori booleani. In JS gli operatori logici restituiscono il valore di uno dei loro argomenti." li hai scambiati, come notò Javier. – stefs

+0

Whoops. Corretta falsa dichiarazione sugli operatori logici. La dichiarazione su! a Lua mi ha gettato. Questo mi insegnerà a leggere troppo velocemente. Wiki della comunità, quindi continua ad aggiungere tutti. – outis

11

Per essere onesti sarebbe più facile elencare le cose che sono comuni a JavaScript e Lua rispetto per elencare le differenze. Sono entrambi linguaggi di scripting con tipi dinamici, ma questo è il massimo che puoi davvero. Hanno sintassi totalmente diverso, diversi obiettivi di progettazione originali, diverse modalità di funzionamento (Lua è sempre compilato in bytecode ed eseguire sul Lua VM, Javascript varia), l'elenco potrebbe continuare all'infinito.

+5

assolutamente. gli obiettivi molto diversi includono un'alta priorità per avere un linguaggio pulito. Javascript ha un sacco di bagagli storici, Lua versa continuamente tutto ciò che non è desiderato. – Javier

+3

+1. Non vedo nemmeno come siano simili, tranne per il fatto che sono entrambi usati per lo scripting (che è troppo ovvio). –

+12

-1 (se potessi) Sono molto simili sul fronte del design della lingua. Lua ha semplicemente più funzioni ed è più piccolo (anche più veloce?). Penso che tu confonda la progettazione linguistica con le scelte di implementazione. – jpc

2

Fuori della parte superiore della mia testa

Lua ...

  1. supporta coroutines
  2. non ha limitazione a solo stringa/numero come chiave per un tavolo. Tutto funziona.
  3. la gestione degli errori è un po 'goffo. O non gestisci niente o usa il metodo pcall
  4. Penso di aver letto qualcosa sulle differenze nello scope lessicale e che Lua abbia il migliore.
  5. Se ricordo il supporto correttamente le espressioni regolari in Lua è limitato
+0

Lua _does_ ha scope lessicale. JavaScript ha solo scopo della funzione. beh, in Mozilla e Rhino puoi ora usare 'let' invece di 'var' e ottenere il corretto scope lessicale; ma non è ancora portatile. – Javier

+1

La libreria di stringhe standard di Lua include funzioni di corrispondenza di pattern limitate; ma c'è anche LPEG (anche una libreria), che fornisce un sistema di corrispondenza molto più potente, facilmente utilizzabile per una grammatica completa. – Javier

+0

Ho affermato che LUA ha lo scope lessicale "migliore", quindi javascript non che non ne abbia. – jitter

7

Gli array e gli oggetti JavaScript sono più vicini di quanto si possa pensare. È possibile utilizzare la notazione di matrice per ottenere gli elementi di uno di essi ed è possibile aggiungere indici non numerici agli array. I singoli elementi dell'array possono contenere qualsiasi cosa e la matrice può essere sparsa. Sono cugini quasi identici.

+1

Si può avere cugini identici? – jameshfisher

+0

Sono la stessa struttura dati, l'unica differenza è il descrittore di tipi in modo che sia possibile distinguerli. –

+5

Un'istruzione più accurata sarebbe: Le matrici sono oggetti con un comportamento speciale del loro membro "lunghezza". – tzenes

8

Un paio di sottili differenze che cattura fuori almeno una volta:

  • Diverso è farro ~= in Lua. In JS è !=
  • Lua arrays are 1-based - il loro primo indice è 1 anziché 0.
  • Lua richiede due punti piuttosto che un periodo di chiamare metodi di un oggetto. Scrivi a:foo() anziché a.foo()e pugnale;

& pugnale; è possibile utilizzare un punto se si desidera, ma è necessario passare la variabile self in modo esplicito. a.foo(a) sembra un po 'macchinoso. Vedi Programming in Lua per i dettagli.

0

Lua e JavaScript sono entrambi linguaggi di base prototipo.

+0

Questa è l'ovvia somiglianza tra i due linguaggi, questo e il loro uso di tabelle/hash come tipo di dati principale. Se dovessi sviluppare un programma Javascript in modo idiomatico, avresti praticamente lo stesso approccio di Lua. Non si farebbe lo stesso in un'altra lingua (a meno che non si tratti di un linguaggio basato su ereditarietà e tabelle di protype). Questa è un'enorme somiglianza. Il resto, i dettagli sulla sintassi minore e così via sono piuttosto pedanti in confronto. –

+0

Le differenze importanti sono che Jaavscript non supporta le coroutine, non è strettamente correlato a C e non è veramente adatto come linguaggio incorporato. (Quanti microcontrollori sono programmati in Javascript?) JavaScript è anche molto più disordinato, con tonnellate di trucchi legacy e WAT (https://www.destroyallsoftware.com/talks/wat) - 1:40. Lua ha imposto una bella disciplina spartana. Javascript, ovviamente, è molto forte nel browser. –

3

Mi è piaciuta questa domanda e le risposte fornite. Ulteriori motivi le due lingue sembrano più simili di quanto non a me:

Entrambi funzioni assegnare alle variabili, possono costruire funzioni al volo, e definire le chiusure.

1

Un test rivela che l'attuale JavaScript restituisce anche gli oggetti, o almeno stringhe da espressioni logiche come Lua fa:

function nix(){ 
    alert(arguments[0]||"0"); 
} 
nix();