2009-06-20 67 views
111

我只是喜欢JavaScript。这是如此的优雅(想象一下在后台叹为观止的痴迷者的安静声音)。JavaScript和Lua之间的细微差异

因此,最近我通过löve2d框架(好!)和Lua一起玩过 - 我觉得Lua也很棒。他们的方式我看到它,那两种语言都很非常类似于

有明显的差异,像

  • 语法
  • 问题域
  • 类型(位)

但有更微妙的呢?有没有什么JavaScript编码器理所当然的适用于Lua,只是略有不同?对于有经验的一种语言的编码器,尝试另一种语言的编码器可能并不明显吗?

例如:在Lua中,数组和哈希不是分离的(只有表) - 在JavaScript中,它们是数值数组和哈希对象。那么,这是一个更明显的差异。

但是,变量的范围,不变性或类似的东西是否存在差异?

+15

1为“(想象痴情想说我叹气在后台安静的声音)。” – UnkwnTech 2009-06-20 23:26:11

+8

对于像我这样的人来说,他们在寻找一个整体比较,并在这里偶然发现,下面是一个很好的概述:http://phrogz.net/lua/LearningLua_FromJS.html – Tao 2012-05-02 10:55:29

+0

Javascript和优雅不应该在同样的句子! – Matt 2017-12-14 09:46:06

回答

165

一些更多的差异:

  • 的Luacoroutines的原生支持。
    • UPDATE:JS现在包含内发电机的产量关键字,给它的协同程序支持。
  • luadoesn't convert不同类型之间的任何比较运算符。在JS中,只有===!==不能打字。
  • Lua有一个指数运算符(^); JS没有。 JS使用不同的运算符,包括三元条件运算符(?: vs and/or),以及5.3中的按位运算符(&,|等与metamethods)。
    • UPDATE:JS现在有指数运算符**
  • JS具有递增/递减,运营商类型(typeofinstanceof),附加的赋值运算符和附加比较运算符。
  • JS,所述=====!=!==运营商比>>=<<=低优先级的。在Lua中,所有比较运算符是same precedence
  • Lua支持tail calls
  • Lua支持assignment to a list of variables。尽管它尚未成为标准,但在Mozilla的JS引擎(和Opera's,在某种程度上)已支持自JS 1.7(可作为Firefox 2的一部分)以“destructuring assignment”名称提供的类似功能。 JS中的解构更加通用,因为它可以用于除赋值之外的上下文中,如function definitions & callsloop initializersDestructuring assignment一直是对ECMAScript(JavaScript背后的语言标准)的一个提议。
    • UPDATE:解构(和解构赋值)现在是ECMAScript规范的一部分 - 已经在许多引擎中实现了。
  • Lua,你可以overload operators
  • 的Lua,你可以用manipulate environmentsgetfenv & setfenv
  • JS,所有功能都是可变的。在Lua中,函数必须是explicitly declared as variadic
  • Foreach in JS在对象属性上循环。Foreach的Lua(其使用关键字for)遍历迭代器和更通用。
    • UPDATE:JS有Iterables现在也一样,其中有许多是内置到你所期望的常规数据结构,如Array。这些可以使用for...of语法循环。对于常规对象,可以实现自己的迭代器函数。这使它更接近Lua。
  • JS具有全局和功能范围。 Luaglobal and block scope。控制结构(例如ifforwhile)引入新的blocks

    • 由于作用域规则的差异,外部变量的封闭的引用(称为在Lua用语“upvalues”)可以在不同的Lua和在的Javascript处理。这是closures in for loops最常遇到的情况,并且让一些人感到意外。在的Javascript,一个for循环体不引入新的范围,所以在循环体中声明的任何函数都引用same outer variables。在Lua中,for循环的每次迭代为每个循环变量创建新的局部变量。

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

      上面的代码等同于:

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

      因此,在单独的迭代定义的函数具有用于每个引用的循环变量不同upvalues。又见萨科博拉的答案Implementation of closures in Lua?和“What are the correct semantics of a closure over a loop variable?”,和“The Semantics of the Generic for”。

      UPDATE:JS现在已经封锁范围。使用letconst来定义的变量会遵守块范围。在JS

  • 整数常量可以在八进制。
  • JS有明确的Unicode支持。
  • Lua,~被用来代替!。 (如,if foo ~= 20 then ... end)(技术上的语法,但很容易被忽略,并导致微妙的错误)。
  • Luanot/or/and关键字被用来代替!/||/&&(也是语法,但也很容易被遗忘)。
  • Lua,可以使用任何类型的值(除了nilNaN)来索引表;在JavaScript中,对象索引转换为字符串。
  • JS,作业被视为表达式,但在Lua他们不是。因此,JS允许在条件为if,whiledo while声明中进行分配,但Lua不在if,whilerepeat until声明中。例如,if (x = 'a') {}是有效的JS,但if x = 'a' do end是无效的Lua。
11

说实话,列出Javascript和Lua常见的东西比列出差异更容易。它们都是动态类型的脚本语言,但只要你真的可以这样做。它们具有完全不同的语法,不同的原始设计目标,不同的操作模式(Lua总是编译为字节码并在Lua VM上运行,Javascript变化),列表依然如此。

+5

绝对。非常不同的目标包括高度重视拥有干净的语言。 Javascript有很多历史包袱,Lua不断丢弃任何不受欢迎的东西。 – Javier 2009-06-20 23:07:12

+3

+1。我什至不知道它们是如何相似的,除了它们都用于脚本(这太明显了)。 – 2009-06-21 01:59:18

+12

-1(如果可以的话)他们在语言设计方面非常相似。 Lua只是有更多的功能,而且更小(也更快?)。我认为你把语言设计和执行选择混为一谈。 – jpc 2011-04-21 10:36:32

2

把我的头

的Lua的顶部...

  1. 支持coroutines
  2. 没有限制,只是字符串/数字作为一个表项。一切正常。
  3. 错误处理有点笨拙。或者你不处理任何东西或者使用pcall方法
  4. 我想我读了一些关于词法范围差异的东西,而且Lua有更好的一个。
  5. 如果我记得在Lua正确的正则表达式的支持仅限
7

JavaScript数组和对象比您想象的要近。您可以使用数组表示法来获取它们中的任何一个的元素,并且可以将非数字索引添加到数组中。单独的数组元素可以容纳任何东西,并且数组可以是稀疏的。他们几乎是相同的堂兄弟。

8

几个细微的差别,将抓住你至少一次:

  • 不等于在Lua中被拼写~=。在JS它是!=
  • 的Lua arrays are 1-based - 他们的第一索引为1而不是0。
  • 的Lua需要结肠,而不是一段时间来调用对象的方法。你写a:foo()而不是a.foo()&dagger;

&dagger;如果需要,您可以使用句点,但必须明确传递self变量。 a.foo(a)看起来有点麻烦。详细信息请参见Programming in Lua

0

Lua和JavaScript都是原型基础语言。

3

我喜欢这个问题,并提供答案。另外的原因,这两种语言比似乎没有更相似对我说:

两个 功能分配变量, 可以动态创建功能, 和定义关闭。

1

的试验表明,电流的Javascript也返回的对象,或者在从逻辑表达式至少串等LUA作用:

function nix(){ 
    alert(arguments[0]||"0"); 
} 
nix(); 
相关问题