Simplemente me encanta JavaScript. Es muy elegante (imagina el sonido tranquilo del fanboy enamorado suspirando en el fondo).
Entonces, recientemente he jugado con Lua a través del marco löve2d (¡genial!), Y creo que Lua también es genial. A mi modo de ver, esos dos idiomas son muy similares.
Hay diferencias obvias, como
- sintaxis
- dominio problemático
- bibliotecas
- tipos (un poco)
pero cuales son los más sutiles? ¿Hay algo que un codificador de JavaScript daría por sentado que funciona en Lua solo un poco diferente? ¿Hay alguna dificultad que puede no ser obvia para el codificador experimentado de un idioma que prueba el otro?
Por ejemplo: en Lua, las matrices y los 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 así?
fuente
Respuestas:
Algunas diferencias más:
===
y!==
no escriba malabares.^
); JS no lo hace. JS utiliza diferentes operadores, incluyendo el operador condicional ternario (?:
vsand/or
), y, a partir de 5.3, operadores bit a bit (&
,|
, etc. vs. metamétodos ).**
.typeof
yinstanceof
), operadores de asignación adicionales y operadores de comparación adicionales.==
,===
,!=
y!==
operadores son de menor precedencia que>
,>=
,<
,<=
. En Lua, todos los operadores de comparación tienen la misma precedencia .getfenv
ysetfenv
en Lua 5.1 o_ENV
en Lua 5.2 y 5.3 .Foreach
en JS recorre las propiedades del objeto. Foreach en Lua (que usa la palabra clavefor
) recorre los iteradores y es más general.Array
. Estos se pueden enlazar con lafor...of
sintaxis. Para objetos normales, uno puede implementar sus propias funciones de iterador. Esto lo acerca mucho más a Lua.JS tiene alcance global y funcional. Lua tiene alcance global y de bloque . Las estructuras de control (p
if
. Ej .for
,while
) Introducen nuevos bloques .Debido a las diferencias en las reglas de alcance, la referencia de cierre de una variable externa (llamada "valores superiores" en lenguaje Lua) puede manejarse de manera diferente en Lua y en Javascript . Esto se experimenta con mayor frecuencia con los cierres en
for
bucles , y sorprende a algunas personas. En Javascript , el cuerpo de unfor
bucle no introduce un nuevo alcance, por lo que todas las funciones declaradas en el cuerpo del bucle hacen referencia a las mismas variables externas . En Lua, cada iteración delfor
ciclo crea nuevas variables locales para cada variable del ciclo.El código anterior es equivalente a:
Como consecuencia, las funciones definidas en iteraciones separadas tienen valores ascendentes diferentes para cada variable de bucle referenciada. Ver también las respuestas de Nicolas Bola a la implementación de cierres en Lua? y " ¿Cuál es la semántica correcta de un cierre sobre una variable de bucle? " y " La semántica de lo genérico para ".
ACTUALIZACIÓN : JS tiene alcance de bloque ahora. Variables definidas con
let
oconst
respetan el alcance del bloque."pâté".toUpperCase()
("PÂTÉ"
). Lua 5.3 y versiones posteriores tienen secuencias de escape de puntos de código Unicode en literales de cadena (con la misma sintaxis que las secuencias de escape de puntos de código JavaScript), así como lautf8
biblioteca incorporada , que proporciona soporte básico para la codificación UTF-8(como codificar puntos de código en UTF-8 y decodificar UTF-8 en puntos de código, obtener el número de puntos de código en una cadena e iterar sobre puntos de código). Las cadenas en Lua son secuencias de bytes individuales y pueden contener texto en cualquier codificación o datos binarios arbitrarios. Lua no tiene ninguna función incorporada que use datos Unicode; el comportamiento destring.upper
depende de la configuración regional C.not
,or
,and
palabras clave se utilizan en lugar de JS s'!
,||
,&&
.~=
para "no igual", mientras que JS usa!==
. Por ejemplo,if foo ~= 20 then ... end
.~
para XOR bitinario binario, mientras que JS usa^
.nil
yNaN
) se puede usar para indexar una tabla. En JavaScript , todos los tipos que no son cadenas (excepto el Símbolo) se convierten en cadenas antes de usarse para indexar un objeto. Por ejemplo, después de la evaluación del código siguiente, el valor deobj[1]
será"string one"
en JavaScript, pero"number one"
en Lua:obj = {}; obj[1] = "number one"; obj["1"] = "string one";
.if
,while
ydo while
declaraciones, pero no lo hace en Luaif
,while
yrepeat until
declaraciones. Por ejemplo,if (x = 'a') {}
es válido JS, peroif x = 'a' do end
no es válido Lua.local function() end
,function t.fieldname() end
,function t:methodname() end
). JS declara estos con un signo igual (let funcname = function optionalFuncname() {}
,objectname.fieldname = function () {}
).fuente
~=
puede provocar errores sutiles . Puede provocar errores de sintaxis , pero no son nada sutiles.Un par de diferencias sutiles que te atraparán al menos una vez:
~=
en Lua. En JS es!=
a:foo()
lugar dea.foo()
†† puede usar un punto si lo desea, pero tiene que pasar la
self
variable explícitamente.a.foo(a)
se ve un poco engorroso. Vea Programación en Lua para más detalles.fuente
†
para la anotación hace que parezca quea.foo()
ha muerto xDPara 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 secuencias de comandos de tipo dinámico, pero eso es lo más lejos que puedes llegar realmente. Tienen una sintaxis totalmente diferente, diferentes objetivos de diseño originales, diferentes modos de operación (Lua siempre se compila para bytecode y se ejecuta en Lua VM, Javascript varía), la lista sigue y sigue.
fuente
prototype
o nombrando objetos de objetos, a pesar de que eso es exactamente lo que son las tablas lua), con funciones como ciudadanos de primera clase a pesar de no ser funcionales en el sentido tradicional (inmutabilidad , desarrollo declarativo, etc.),Las matrices y objetos de JavaScript 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.
fuente
La parte superior de mi cabeza
Lua ...
fuente
Me gustó esta pregunta y las respuestas proporcionadas. Razones adicionales que los dos idiomas me parecen más parecidos que a mí:
Ambos asignan funciones a variables, pueden construir funciones sobre la marcha y definir cierres.
fuente
Lua y JavaScript son ambos lenguajes base prototipo.
fuente
Una prueba revela que Javascript actual también devuelve objetos, o al menos cadenas de expresiones lógicas como lo hace lua:
fuente