JavaScript和Lua之间的细微差别

我只是喜欢JavaScript。 这是如此的优雅(想象一下,在后台叹息爱好者的安静声音)。

所以,最近我通过löve2d框架和Lua一起玩 (好!) – 我觉得Lua也很棒。 他们的方式我看,这两种语言是非常相似的。

有明显的差异,像

  • 句法
  • 问题领域
  • 图书馆
  • types(一点)

但哪一个更微妙呢? 有没有什么JavaScript编码器会理所当然地在Lua中工作,只是略有不同? 对于有经验的另一种语言的编码器来说,是否有任何不明显的缺陷?

例如:在Lua中,数组和散列不是分开的(只有表) – 在JavaScript中,它们是数字数组和哈希对象。 那么这是一个比较明显的区别。

但是variables的范围,不变性或者类似的东西是否有区别呢?

还有一些不同:

  • Lua拥有对协程的本地支持。
    • 更新 :JS现在包含生成器内的yield关键字,支持协程。
  • Lua 不会在任何比较运算符的types之间进行转换 。 在JS中,只有===!==不要键入玩弄。
  • Lua有一个指数运算符( ^ ); JS没有。 JS使用不同的运算符,包括三元条件运算符( ?: vs and/or ),以及5.3中的按位运算符( &|等与元方法 )。
    • 更新 :JS现在有指数运算符**
  • JS有递增/递减,types操作符( typeofinstanceof ),附加赋值操作符和附加比较操作符。
  • JS中=====!=!==运算符的优先级低于>>=<<= 。 在Lua中,所有的比较运算符都是相同的优先级 。
  • Lua支持尾巴呼叫 。
    • 更新 :JS现在支持尾调用 。
  • Lua支持赋值给一个variables列表 。 尽pipeJavascript还不是标准的,但是Mozilla的JS引擎(和Opera在一定程度上)已经支持了自JS 1.7(可作为Firefox 2的一部分)以“ 解构赋值 ”命名的类似特性。 JS中的解构是更一般化的,因为它可以在除赋值之外的上下文中使用,比如函数定义和调用和循环初始化 。 解构赋值一直是对ECMAScript(JavaScript背后的语言标准)的一个提议。
    • 更新 :解构(和解构赋值)现在是ECMAScript规范的一部分 – 已经在许多引擎中实现了。
  • Lua中 ,你可以重载操作符 。
  • Lua中 ,您可以使用getfenvsetfenv来操作环境 。
  • JS中 ,所有的function是可变的。 在Lua中 ,函数必须显式声明为可变参数 。
  • Foreach中的对象属性的JS循环。 Lua中的 foreach (使用关键字)循环遍历迭代器,更一般。
    • 更新 :JS现在也有Iterables ,其中许多内置到您所期望的常规数据结构中,如Array 。 这些可以循环与for...of语法。 对于常规的对象,可以实现自己的迭代器function。 这使得它更接近Lua。
  • JS具有全局和function范围。 Lua拥有全局和块范围 。 控制结构(例如, ifwhile )引入新块 。

    • 由于作用域规则的不同,在Lua和Javascript中可能会以不同的方式处理一个外部variables的引用(在Lua中称为“upvalues”)。 这是在闭环中最常见的经验,并捕捉到一些人的惊喜。 在Javascript中for循环的主体没有引入新的作用域,所以在循环体中声明的所有函数都引用相同的外部variables 。 在Lua中, for循环的每次迭代为每个循环variables创build新的局部variables。

       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) 

      因此,对于每个被引用的循环variables,在单独迭代中定义的函数具有不同的上限值。 另见尼古拉斯·博拉(Nicolas Bola) 在Lua中关于实施closures的答案? 和“ 关于循环variables的闭包的正确语义是什么? ”和“ 泛类的语义 ”。

      更新 :JS现在有块范围。 使用letconst尊重块范围定义的variables。

  • JS中的整数文字可以是八进制的。
  • JS有明确的Unicode支持。
  • Lua中~被用来代替! 。 ( if foo ~= 20 then ... endif foo ~= 20 then ... end )(技术上的语法,但它很容易被忽略,并导致微妙的错误)。
  • Lua中not/or/and关键字来代替!/||/&& (也是语法,但也很容易被遗忘)。
  • Lua中 ,可以使用任何types的值(除了nilNaN )来索引表; 在JavaScript中 ,对象索引被转换为string。

说实话,列出Javascript和Lua常见的东西比列出差异更容易。 它们都是dynamictypes的脚本语言,但是就你所能做到的而言, 他们有完全不同的语法,不同的原始devise目标,不同的操作模式(Lua总是编译成字节码并在Lua VM上运行,Javascript变化),列表不断变化。

两个微妙的差异,至less会一次捕捉你:

  • 在Lua中拼写不等于拼写。 在JS中它是!=
  • Lua 数组是基于1的 – 他们的第一个索引是1而不是0。
  • Lua需要一个冒号而不是句号来调用对象方法。 你写a:foo()而不是a.foo()

如果需要,可以使用句点,但必须明确地传递selfvariables。 a.foo(a)看起来有点麻烦。 详情请参阅Lua中的编程 。

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

我喜欢这个问题,并提供了答案。 这两种语言似乎比我更不相同的其他原因:

将函数分配给variables,可以即时构build函数,并定义闭包。

离开我的头顶

Lua …

  1. 支持协程
  2. 没有限制只是串/数字作为表的关键。 一切正常。
  3. error handling有点笨拙。 要么你不处理任何东西,要么使用pcall方法
  4. 我想我读了一些关于词汇范围的差异,而且Lua有更好的一个。
  5. 如果我记得在lua中正则expression式的支持是有限的

一个testing表明,目前的Javascript也返回对象,或至less从逻辑expression式如lua所做的string:

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

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