2009-06-20 13 views
111

Simplemente amo JavaScript. Es tan elegante (imagina el sonido silencioso de un fanático enamorado suspirando en el fondo).diferencias sutiles entre JavaScript y Lua

Por lo tanto, recientemente he jugado con Lua a través del framework löve2d (¡agradable!) - y creo que Lua también es genial. Como yo lo veo, esos dos idiomas son muy similar.

Hay diferencias obvias, como

  • sintaxis
  • dominio del problema
  • bibliotecas
  • tipos (un poco)

pero que son los más sutiles? ¿Hay algo que un programador de JavaScript daría por sentado que funciona en Lua un poco diferente? ¿Hay dificultades que pueden no ser obvias para el codificador experimentado de un idioma que intenta el otro?

Por ejemplo: en Lua, las matrices y hashes no están separados (solo hay tablas) - en JavaScript, son Matrices numéricas y Objetos hash. Bueno, esta es una de las diferencias más obvias.

¿Pero hay diferencias en el alcance variable, la inmutabilidad o algo como esto?

+15

+1 para "(imaginar el sonido tranquilo de suspiros fanboy, enfermo de amor en el fondo)." – UnkwnTech

+8

Para aquellos, como yo, que buscaban una comparación general y terminaron aquí por accidente, la siguiente es una buena descripción: http://phrogz.net/lua/LearningLua_FromJS.html – Tao

+0

Javascript y elegante no debe estar en el la misma oración! – Matt

Respuesta

165

Algunos más diferencias:

  • Lua tiene soporte nativo para coroutines.
    • ACTUALIZACIÓN: JS ahora contiene la palabra clave yield dentro de los generadores, dándole soporte para coroutines.
  • Luadoesn't convert entre los tipos de los operadores de comparación. En JS, solo === y !== no escriben malabares.
  • Lua tiene un operador de exponenciación (^); JS no. JS utiliza diferentes operadores, incluyendo el operador condicional ternario (?: vs and/or), y, a partir de 5,3, operadores bit a bit (&, |, etc. vs. metamethods).
    • ACTUALIZACIÓN: JS ahora tiene el operador de exponenciación **.
  • JS tiene incremento/decremento, los operadores de tipo (typeof y instanceof), operadores de asignación adicionales y operadores de comparación adicionales.
  • En JS, los ==, ===, != y !== operadores son de menor precedencia que >, >=, <, <=. En Lua, todos los operadores de comparación son same precedence.
  • Lua admite tail calls.
  • Lua soportaassignment to a list of variables. Si bien todavía no es estándar en Javascript, el motor JS de Mozilla (y el de Opera, hasta cierto punto) ha admitido una característica similar desde JS 1.7 (disponible como parte de Firefox 2) bajo el nombre "destructuring assignment". La desestructuración en JS es más general, ya que se puede usar en contextos distintos a la asignación, como function definitions & calls y loop initializers. Destructuring assignment ha sido una adición propuesta a ECMAScript (el estándar de lenguaje detrás de Javascript) por un tiempo.
    • ACTUALIZACIÓN: La desestructuración (y asignación desestructurada) es ahora parte de la especificación de ECMAScript - ya implementada en muchos motores.
  • En Lua, puede overload operators.
  • En Lua, puede manipulate environments con getfenv & setfenv.
  • En JS, todas las funciones son variadas. En Lua, las funciones deben ser explicitly declared as variadic.
  • Foreach en JS bucles sobre las propiedades del objeto.Foreach en Lua (que usa la palabra clave for) pasa por encima de los iteradores y es más general.
    • ACTUALIZACIÓN: JS tiene Iterables ahora también, muchas de las cuales están incorporadas en las estructuras de datos regulares que cabe esperar, como Array. Estos pueden enlazarse con la sintaxis for...of. Para objetos regulares, uno puede implementar sus propias funciones de iterador. Esto lo acerca mucho más a Lua.
  • JS tiene alcance global y de funciones. Lua tiene global and block scope. Las estructuras de control (por ejemplo, if, for, while) introducen el nuevo blocks.

    • Debido a las diferencias en las reglas de determinación del alcance, las referencias de un cierre de una variable externa (llamada "upvalues" en el lenguaje Lua) puede manejarse de manera diferente en Lua y en Javascript. Esto se experimenta más comúnmente con closures in for loops, y coge a algunas personas por sorpresa. En Javascript, el cuerpo de un bucle for no introduce un nuevo ámbito, por lo que cualquier función declarada en el cuerpo del bucle hace referencia al same outer variables. En Lua, cada iteración del bucle for crea nuevas variables locales para cada variable de bucle.

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

      El código anterior es equivalente a:

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

      Como consecuencia, las funciones definidas en iteraciones independientes tienen diferentes upvalues ​​para cada variable de bucle de referencia. Ver también las respuestas de Nicolas Bola al Implementation of closures in Lua? y "What are the correct semantics of a closure over a loop variable?", y "The Semantics of the Generic for".

      ACTUALIZACIÓN: JS tiene alcance de bloque ahora. Las variables definidas con let o const respetan el alcance del bloque.

  • literales enteros en JS pueden estar en octal.
  • JS tiene compatibilidad explícita con Unicode.
  • En Lua, ~ se usa en lugar de !. (como en, if foo ~= 20 then ... end) (sintaxis técnica, pero se pasa por alto fácilmente y causa errores sutiles).
  • En Lua, las palabras clave not/or/and se usan en lugar de !/||/&& (también sintaxis pero también se olvidan fácilmente).
  • En Lua, se puede usar cualquier tipo de valor (excepto nil y NaN) para indexar una tabla; en JavaScript, los índices de objeto se convierten en cadenas.
  • En JS, las asignaciones se tratan como expresiones, pero en Lua no lo son.Por lo tanto, JS permite asignaciones en condiciones de if, while y do while declaraciones, pero Lua no en if, while y repeat until declaraciones. Por ejemplo, if (x = 'a') {} es JS válido, pero if x = 'a' do end es Lua no válido.
+4

en Lua, los operadores lógicos (y, o) devuelven uno de los argumentos. todas las funciones se pueden invocar con cualquier cantidad de parámetros; pero se ajustan al número necesario (a menos que uses el ... 'extra args') – Javier

+0

gracias, esa es una lista muy buena (y exactamente lo que esperaba). "# En Lua, los operadores lógicos devuelven valores booleanos. En JS, los operadores lógicos devuelven el valor de uno de sus argumentos". Cambiaste esos, como notó Javier. – stefs

+0

Whoops. Sentencia falsa corregida sobre operadores lógicos. La declaración sobre! en Lua me tiró. Eso me enseñará a leer demasiado rápido. Wiki de la comunidad, así que sigue agregando a todos. – outis

11

Para ser sincero, sería más fácil enumerar las cosas que son comunes a Javascript y Lua que enumerar las diferencias. Ambos son lenguajes de scripting de tipo dinámico, pero eso es lo más que puedes llegar realmente. Tienen una sintaxis totalmente diferente, diferentes objetivos de diseño originales, diferentes modos de operación (Lua siempre se compila en bytecode y se ejecuta en Lua VM, Javascript varía), la lista sigue y sigue.

+5

absolutamente. los objetivos muy diferentes incluyen una alta prioridad para tener un lenguaje limpio. Javascript tiene mucho equipaje histórico, Lua arroja continuamente todo lo que no es deseado. – Javier

+3

+1. Ni siquiera veo cómo son similares en absoluto, excepto por el hecho de que ambos se usan para crear scripts (lo cual es demasiado obvio). –

+12

-1 (si pudiera) Son muy similares en el diseño del lenguaje. Lua simplemente tiene más funciones y es más pequeño (¿también más rápido?). Creo que confundes el diseño del lenguaje con las opciones de implementación. – jpc

2

De la parte superior de mi cabeza

Lua ...

  1. apoya coroutines
  2. tiene ninguna restricción a poco cadena/número como la clave para una tabla. Todo funciona.
  3. el manejo de errores es algo torpe. O bien no maneja nada o usa el método pcall
  4. Creo que leí algo acerca de las diferencias en el alcance léxico y que Lua tiene la mejor.
  5. Si recuerdo correctamente soporte de expresiones regulares en Lua es limitado
+0

Lua _does_ tiene alcance léxico. JavaScript solo tiene alcance de función. bueno, en Mozilla y Rhino ahora puedes usar 'let' en lugar de 'var' y obtener el alcance léxico apropiado; pero aún no es portátil. – Javier

+1

La biblioteca de cadenas estándar de Lua incluye funciones de coincidencia de patrones limitadas; pero también hay LPEG (también una biblioteca), que ofrece un sistema de correspondencia mucho más poderoso, fácilmente utilizable para una gramática completa. – Javier

+0

Declaré que LUA tiene el alcance léxico "mejor" que javascript, no es que tenga ninguno. – jitter

7

Las matrices de JavaScript y los objetos están más cerca de lo que piensas. Puede usar la notación de matriz para obtener los elementos de cualquiera de ellos, y puede agregar índices no numéricos a las matrices. Los elementos de matriz individuales pueden contener cualquier cosa, y la matriz puede ser escasa. Son primos casi idénticos.

+1

¿Puede uno tener primos idénticos? – jameshfisher

+0

Son la misma estructura de datos, la única diferencia es el descriptor de tipo para que pueda diferenciarlos. –

+5

Una declaración más precisa sería: las matrices son objetos con un comportamiento especial de su miembro de "longitud". – tzenes

8

Un par de diferencias sutiles que te atrapará a cabo al menos una vez:

  • No igual ~= se escribe en Lua. En JS es !=
  • Lua arrays are 1-based - su primer índice es 1 en vez de 0.
  • Lua requiere dos puntos en lugar de un período para llamar a métodos de objeto. Usted escribe a:foo() en lugar de a.foo()& dagger;

& dagger; puede usar un período si lo desea, pero debe pasar la variable self explícitamente. a.foo(a) parece un poco engorroso. Vea Programming in Lua para más detalles.

0

Lua y JavaScript son dos idiomas base de prototipo.

+0

Esta es la similitud obvia entre los dos idiomas, esto y su uso de tablas/hashes como el tipo de datos principal. Si desarrollases un programa Javascript idiomáticamente, tomarías prácticamente el mismo enfoque que en Lua. No haría lo mismo en ningún otro idioma (a menos que sea un idioma basado en la herencia de protype y las tablas). Esta es una gran similitud. El resto, los detalles sobre la sintaxis menor y demás son bastante pedantes en comparación. –

+0

Las diferencias importantes son que Jaavscript no admite corutinas, no está muy unido a C, y no es realmente adecuado como lenguaje incrustado. (¿Cuántos microcontroladores están programados en Javascript?) Javascript también es mucho más desordenado, con toneladas de errores heredados y WAT (https://www.destroyallsoftware.com/talks/wat) - de 1:40. Lua ha tenido una hermosa disciplina espartana impuesta. Javascript, por supuesto, es muy fuerte en el navegador. –

3

Me ha gustado esta pregunta y las respuestas proporcionadas. Otras razones las dos lenguas parecen más parecidos de lo que no me

:

Ambas funciones asignar a las variables, pueden construir funciones sobre la marcha, y definir los cierres.

1

Una prueba revela que la corriente Javascript también devuelve los objetos, o al menos las cadenas de expresiones lógicas como LUA:

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