JavaScript和Lua之间的细微差别
我只是喜欢JavaScript。 这是如此的优雅(想象一下,在后台叹息爱好者的安静声音)。
所以,最近我通过löve2d框架和Lua一起玩 (好!) – 我觉得Lua也很棒。 他们的方式我看,这两种语言是非常相似的。
有明显的差异,像
- 句法
- 问题领域
- 图书馆
- types(一点)
但哪一个更微妙呢? 有没有什么JavaScript编码器会理所当然地在Lua中工作,只是略有不同? 对于有经验的另一种语言的编码器来说,是否有任何不明显的缺陷?
例如:在Lua中,数组和散列不是分开的(只有表) – 在JavaScript中,它们是数字数组和哈希对象。 那么这是一个比较明显的区别。
但是variables的范围,不变性或者类似的东西是否有区别呢?
还有一些不同:
- Lua拥有对协程的本地支持。
- 更新 :JS现在包含生成器内的yield关键字,支持协程。
- Lua 不会在任何比较运算符的types之间进行转换 。 在JS中,只有
===
和!==
不要键入玩弄。 - Lua有一个指数运算符(
^
); JS没有。 JS使用不同的运算符,包括三元条件运算符(?:
vsand/or
),以及5.3中的按位运算符(&
,|
等与元方法 )。- 更新 :JS现在有指数运算符
**
。
- 更新 :JS现在有指数运算符
- JS有递增/递减,types操作符(
typeof
和instanceof
),附加赋值操作符和附加比较操作符。 - 在JS中 ,
==
,===
,!=
和!==
运算符的优先级低于>
,>=
,<
,<=
。 在Lua中,所有的比较运算符都是相同的优先级 。 - Lua支持尾巴呼叫 。
- 更新 :JS现在支持尾调用 。
- Lua支持赋值给一个variables列表 。 尽pipeJavascript还不是标准的,但是Mozilla的JS引擎(和Opera在一定程度上)已经支持了自JS 1.7(可作为Firefox 2的一部分)以“ 解构赋值 ”命名的类似特性。 JS中的解构是更一般化的,因为它可以在除赋值之外的上下文中使用,比如函数定义和调用和循环初始化 。 解构赋值一直是对ECMAScript(JavaScript背后的语言标准)的一个提议。
- 更新 :解构(和解构赋值)现在是ECMAScript规范的一部分 – 已经在许多引擎中实现了。
- 在Lua中 ,你可以重载操作符 。
- 在Lua中 ,您可以使用
getfenv
&setfenv
来操作环境 。 - 在JS中 ,所有的function是可变的。 在Lua中 ,函数必须显式声明为可变参数 。
-
Foreach
中的对象属性的JS循环。 Lua中的 foreach (使用关键字)循环遍历迭代器,更一般。- 更新 :JS现在也有Iterables ,其中许多内置到您所期望的常规数据结构中,如
Array
。 这些可以循环与for...of
语法。 对于常规的对象,可以实现自己的迭代器function。 这使得它更接近Lua。
- 更新 :JS现在也有Iterables ,其中许多内置到您所期望的常规数据结构中,如
-
JS具有全局和function范围。 Lua拥有全局和块范围 。 控制结构(例如,
if
,while
)引入新块 。-
由于作用域规则的不同,在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现在有块范围。 使用
let
或const
尊重块范围定义的variables。
-
- JS中的整数文字可以是八进制的。
- JS有明确的Unicode支持。
- 在Lua中 ,
~
被用来代替!
。 (if foo ~= 20 then ... end
,if foo ~= 20 then ... end
)(技术上的语法,但它很容易被忽略,并导致微妙的错误)。 - 在Lua中 ,
not/or/and
关键字来代替!/||/&&
(也是语法,但也很容易被遗忘)。 - 在Lua中 ,可以使用任何types的值(除了
nil
和NaN
)来索引表; 在JavaScript中 ,对象索引被转换为string。
说实话,列出Javascript和Lua常见的东西比列出差异更容易。 它们都是dynamictypes的脚本语言,但是就你所能做到的而言, 他们有完全不同的语法,不同的原始devise目标,不同的操作模式(Lua总是编译成字节码并在Lua VM上运行,Javascript变化),列表不断变化。
两个微妙的差异,至less会一次捕捉你:
- 在Lua中拼写不等于拼写。 在JS中它是
!=
- Lua 数组是基于1的 – 他们的第一个索引是1而不是0。
- Lua需要一个冒号而不是句号来调用对象方法。 你写
a:foo()
而不是a.foo()
†
†如果需要,可以使用句点,但必须明确地传递self
variables。 a.foo(a)
看起来有点麻烦。 详情请参阅Lua中的编程 。
JavaScript数组和对象比您想象的要近。 您可以使用数组表示法来获取其中任何一个的元素,并且可以将非数字索引添加到数组中。 单个数组元素可以容纳任何东西,而数组可以是稀疏的。 他们几乎是相同的堂兄弟。
我喜欢这个问题,并提供了答案。 这两种语言似乎比我更不相同的其他原因:
将函数分配给variables,可以即时构build函数,并定义闭包。
离开我的头顶
Lua …
- 支持协程
- 没有限制只是串/数字作为表的关键。 一切正常。
- error handling有点笨拙。 要么你不处理任何东西,要么使用pcall方法
- 我想我读了一些关于词汇范围的差异,而且Lua有更好的一个。
- 如果我记得在lua中正则expression式的支持是有限的
一个testing表明,目前的Javascript也返回对象,或至less从逻辑expression式如lua所做的string:
function nix(){ alert(arguments[0]||"0"); } nix();
Lua和JavaScript都是原型基础语言。