JavaScript和Lua之间的细微差别

ste*_*efs 120 javascript lua

我只是喜欢JavaScript.这是如此优雅(想象一下在背景中叹息的爱情狂热的声音).

所以,最近我通过löve2d框架玩了Lua (很好!) - 我认为Lua也很棒.他们看待它,这两种语言非常相似.

有明显的差异,比如

  • 句法
  • 问题域
  • 图书馆
  • 类型(一点)

但哪些是更微妙的?JavaScript编码器是否会认为在Lua中工作的东西略有不同?是否有任何陷阱对于有经验的编程人员尝试另一种语言而言可能并不明显?

例如:在Lua中,数组和散列不是分开的(只有表格) - 在JavaScript中,它们是数字数组和散列对象.嗯,这是一个比较明显的差异.

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

out*_*tis 185

更多的差异:

  • Lua本身就支持协同程序.
    • 更新:JS现在在generator中包含yield关键字,为协程提供支持.
  • 对于任何比较运算符,Lua 不会在类型之间进行转换.在JS中,只有===并且!==不要键入juggle.
  • Lua有一个取幂运算符(^); JS没有.JS使用不同的运营商,包括三元条件操作符(?:VS and/or),并且,如5.3,位运算符(的&,|等与元方法).
    • 更新:JS现在有了取幂运算符**.
  • JS具有递增/递减,类型运算符(typeofinstanceof),附加赋值运算符和其他比较运算符.
  • JS==,===,!=!==运营商都低于优先级>,>=,<,<=.在Lua中,所有比较运算符都具有相同的优先级.
  • Lua支持尾调用.
  • Lua支持分配变量列表.虽然它在Javascript中尚未成为标准,但Mozilla的JS引擎(以及Opera在某种程度上)支持了自JS 1.7(作为Firefox 2的一部分提供)以" destructuring assignment " 命名的类似功能.JS中的解构更通用,因为它可以在除赋值之外的上下文中使用,例如函数定义和调用以及循环初始化器.解构分配已经成为ECMAScript(Javascript背后的语言标准)的一个建议的补充.
    • 更新:解构(和解构分配)现在是ECMAScript规范的一部分 - 已在许多引擎中实现.
  • Lua中,您可以重载运算符.
  • Lua中,你可以操纵与环境getfenvsetfenv在Lua 5.1或_ENVLua中5.25.3.
  • JS中,所有函数都是可变的.在Lua中,函数必须显式声明为variadic.
  • ForeachJS中循环对象属性.的foreachLua中(其中使用关键字for)遍历迭代器和更通用.
    • 更新:JS 现在也有Iterables,其中许多内置于您期望的常规数据结构中,例如Array.这些可以用for...of语法循环.对于常规对象,可以实现自己的迭代器函数.这使它更接近Lua.
  • JS具有全局和功能范围.Lua具有全局和块范围.控制结构(例如if,for,while)引入新的.

  • JS中的整数文字可以是八进制的.
  • JS具有明确的Unicode支持,内部字符串以UTF-16编码(因此它们是字节对的序列).各种内置JavaScript函数使用Unicode数据,例如"pâté".toUpperCase()("PÂTÉ").Lua 5.3及更高版本在字符串文字中具有Unicode代码点转义序列(与JavaScript代码点转义序列具有相同的语法)以及内置utf8库,它提供对UTF-8编码的基本支持(例如编码代码点)进入UTF-8并将UTF-8解码为代码点,获取字符串中的代码点数,并迭代代码点).Lua中的字符串是单个字节的序列,可以包含任何编码或任意二进制数据中的文本.Lua没有任何使用Unicode数据的内置函数; 行为string.upper取决于C语言环境.
  • Lua中not,or,and关键字代替使用JS!,||,&&.
  • Lua使用~="不相等",而JS使用!==.例如,if foo ~= 20 then ... end.
  • Lua 5.3及以上~用于二进制按位异或,而JS使用 ^.
  • Lua中,任何类型的值(除了nilNaN)都可以用来索引表; 在JavaScript中,所有非字符串类型(Symbol除外)在用于索引对象之前都会转换为字符串.
  • JS中,赋值被视为表达式,但在Lua中它们不是.因此,JS允许条件下作业obj[1],"string one""number one"语句,但Lua中没有的obj = {}; obj[1] = "number one"; obj["1"] = "string one";,ifwhile语句.例如,do while是有效的JS,但是ifLua是无效的.
  • LUA具有用于声明块范围的函数的变量,即是字段功能语法糖,和方法(while,repeat until,if (x = 'a') {}).JS用等号(if x = 'a' do end,local function() end)声明这些.

  • 我认为你可以在列表中添加基于1的数组,当你不习惯它时可能会很烦人. (8认同)
  • 在Lua中,逻辑运算符(和,或)确实返回其中一个参数.可以使用任意数量的参数调用所有函数; 但调整到所需的数量(除非你使用...'额外的args') (6认同)
  • 我喜欢这个列表,但我不知道`〜=`是如何引发*微妙的*错误的.它可能会引发*语法错误*,但它们并不是很微妙. (4认同)
  • 在Lua中只有nil和false是假的 - 所以,例如,0在Lua中是真实的而在js中不是真的.关于Unicode支持:Lua 5.3增加了一些显式的UTF-8支持,而较旧的Lua版本对字符串中保存的UTF-8缓冲区很友好(例如,您可以在字符串搜索模式中使用Unicode).Js对UTF-8的支持并不完美,因为V8内部使用了一个旧的16位表示,所以你的unicode字符串可能最终得到(惊奇!)代理对,而这些代表对在优质的'UTF-8中是不需要的(并赢了)不会发生在Lua). (2认同)

ric*_*chq 12

一些微妙的差异,至少会抓住你一次:

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

如果需要,可以使用句点,但必须self明确传递变量.a.foo(a)看起来有点累赘.有关详细信息,请参阅Lua编程.

  • 使用`†`进行注释使'a.foo()`似乎已经失效xD (4认同)

Dav*_*veR 11

说实话,列出Javascript和Lua常用的东西比列出差异更容易.它们都是动态类型的脚本语言,但这就是你可以实现的.它们具有完全不同的语法,不同的原始设计目标,不同的操作模式(Lua总是编译为字节码并在Lua VM上运行,Javascript不同),列表一直在继续.

  • -1(如果可以的话)他们在语言设计方面非常相似.Lua只是有更多的功能而且更小(也更快?).我认为你把语言设计与实现选择混为一谈. (13认同)
  • 绝对.不同的目标包括拥有干净语言的高度优先权.Javascript有很多历史包袱,Lua不断地抛弃任何不受欢迎的东西. (8认同)
  • +1.我甚至都没看到它们是如何相似的,除了它们都用于编写脚本(这太明显了). (3认同)
  • 当然,存在句法差异,如果您从表面上看,您可能会得出结论,这些语言是不同的。**然而**在拥有完全相同的主要数据类型(对象/表)和实现类和继承的相同方式(这是*很少有其他语言共享的)使它们在精神上非常接近。非平凡 JS 程序的设计与 Lua 程序的设计几乎相同。 (3认同)

Nos*_*dna 7

JavaScript数组和对象比您想象的更接近.您可以使用数组表示法来获取其中任何一个的元素,并且可以向数组添加非数字索引.单个数组元素可以保存任何内容,并且数组可以是稀疏的.他们是几乎相同的堂兄弟.

  • 更准确的说法是:数组是具有"长度"成员特殊行为的对象. (5认同)