ste*_*efs 120 javascript lua
我只是喜欢JavaScript.这是如此优雅(想象一下在背景中叹息的爱情狂热的声音).
所以,最近我通过löve2d框架玩了Lua (很好!) - 我认为Lua也很棒.他们看待它,这两种语言非常相似.
有明显的差异,比如
但哪些是更微妙的?JavaScript编码器是否会认为在Lua中工作的东西略有不同?是否有任何陷阱对于有经验的编程人员尝试另一种语言而言可能并不明显?
例如:在Lua中,数组和散列不是分开的(只有表格) - 在JavaScript中,它们是数字数组和散列对象.嗯,这是一个比较明显的差异.
但是在变量范围,不变性或类似的东西方面是否存在差异?
out*_*tis 185
更多的差异:
===并且!==不要键入juggle.^); JS没有.JS使用不同的运营商,包括三元条件操作符(?:VS and/or),并且,如5.3,位运算符(的&,|等与元方法).
**.typeof和instanceof),附加赋值运算符和其他比较运算符.==,===,!=和!==运营商都低于优先级>,>=,<,<=.在Lua中,所有比较运算符都具有相同的优先级.getfenv和setfenv在Lua 5.1或_ENV在Lua中5.2和5.3.Foreach在JS中循环对象属性.的foreach在Lua中(其中使用关键字for)遍历迭代器和更通用.
Array.这些可以用for...of语法循环.对于常规对象,可以实现自己的迭代器函数.这使它更接近Lua.JS具有全局和功能范围.Lua具有全局和块范围.控制结构(例如if,for,while)引入新的块.
由于范围规则的不同,闭包引用外部变量(在Lua用语中称为"upvalues")可能在Lua和Javascript中以不同方式处理.这种情况最常见于for闭环中,并且让一些人感到意外.在Javascript中,for循环体不会引入新的作用域,因此循环体中声明的所有函数都引用相同的外部变量.在Lua中,循环的每次迭代for都会为每个循环变量创建新的局部变量.
local i='foo'
for i=1,10 do
-- "i" here is not the local "i" declared above
...
end
print(i) -- prints 'foo'
Run Code Online (Sandbox Code Playgroud)
上面的代码相当于:
local i='foo'
do
local _i=1
while _i<10 do
local i=_i
...
_i=_i+1
end
end
print(i)
Run Code Online (Sandbox Code Playgroud)
因此,在单独的迭代中定义的函数对于每个引用的循环变量具有不同的upvalues.另见Nicolas Bola 在Lua中实现闭包的答案?和" 循环变量的闭包的正确语义是什么? "和" Generic for Seneric ".
更新:JS现在具有块范围.用块let或const范围定义的变量.
"pâté".toUpperCase()("PÂTÉ").Lua 5.3及更高版本在字符串文字中具有Unicode代码点转义序列(与JavaScript代码点转义序列具有相同的语法)以及内置utf8库,它提供对UTF-8编码的基本支持(例如编码代码点)进入UTF-8并将UTF-8解码为代码点,获取字符串中的代码点数,并迭代代码点).Lua中的字符串是单个字节的序列,可以包含任何编码或任意二进制数据中的文本.Lua没有任何使用Unicode数据的内置函数; 行为string.upper取决于C语言环境.not,or,and关键字代替使用JS的!,||,&&.~="不相等",而JS使用!==.例如,if foo ~= 20 then ... end.~用于二进制按位异或,而JS使用 ^.nil和NaN)都可以用来索引表; 在JavaScript中,所有非字符串类型(Symbol除外)在用于索引对象之前都会转换为字符串.obj[1],"string one"和"number one"语句,但Lua中没有的obj = {}; obj[1] = "number one"; obj["1"] = "string one";,if和while语句.例如,do while是有效的JS,但是ifLua是无效的.while,repeat until,if (x = 'a') {}).JS用等号(if x = 'a' do end,local function() end)声明这些.Dav*_*veR 11
说实话,列出Javascript和Lua常用的东西比列出差异更容易.它们都是动态类型的脚本语言,但这就是你可以实现的.它们具有完全不同的语法,不同的原始设计目标,不同的操作模式(Lua总是编译为字节码并在Lua VM上运行,Javascript不同),列表一直在继续.
JavaScript数组和对象比您想象的更接近.您可以使用数组表示法来获取其中任何一个的元素,并且可以向数组添加非数字索引.单个数组元素可以保存任何内容,并且数组可以是稀疏的.他们是几乎相同的堂兄弟.