JavaScript和Lua之间的细微差异

JavaScript和Lua之间的细微差异,javascript,lua,Javascript,Lua,我只是喜欢JavaScript。它是如此优雅(想象一下背景中沉迷于爱情的粉丝们发出的安静的叹息声) 所以,最近我通过框架(很好!)使用了Lua,我认为Lua也很棒。在我看来,这两种语言非常相似 有明显的区别,比如 语法 问题域 图书馆 类型(一点) 但哪一个更微妙?JavaScript程序员是否会认为在Lua中工作是理所当然的,只是略有不同?对于一种语言的有经验的程序员来说,尝试另一种语言是否存在任何不明显的陷阱 例如:在Lua中,数组和散列不是分开的(只有表)——在JavaScript中,

我只是喜欢JavaScript。它是如此优雅(想象一下背景中沉迷于爱情的粉丝们发出的安静的叹息声)

所以,最近我通过框架(很好!)使用了Lua,我认为Lua也很棒。在我看来,这两种语言非常相似

有明显的区别,比如

  • 语法
  • 问题域
  • 图书馆
  • 类型(一点)
但哪一个更微妙?JavaScript程序员是否会认为在Lua中工作是理所当然的,只是略有不同?对于一种语言的有经验的程序员来说,尝试另一种语言是否存在任何不明显的陷阱

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


但是在变量范围、不变性或类似的东西上有差异吗?

老实说,列出Javascript和Lua的共同点要比列出差异更容易。它们都是动态类型化的脚本语言,但这只是你能做到的。它们有完全不同的语法、不同的原始设计目标、不同的操作模式(Lua总是编译成字节码并在Lua VM上运行,Javascript也各不相同),这一列表层出不穷

卢阿

  • 支持
  • 不限制将字符串/数字作为表的键。一切正常
  • 错误处理有些笨拙。要么你什么都不处理,要么你就用这个方法
  • 我想我读到了一些关于词汇范围差异的东西,Lua有更好的
  • 如果我没记错的话,lua中对正则表达式的支持是有限的

  • 还有一些区别:

    • Lua具有对的本地支持。
      • 更新:JS现在在生成器中包含yield关键字,支持协同程序
    • 任何比较运算符的类型之间的Lua。在JS中,只有
      ==
      ==不要键入“变戏法”
    • Lua有一个求幂运算符(
      ^
      );JS没有。JS使用不同的运算符,包括三元条件运算符(
      ?:
      vs
      和/或
      ),以及从5.3开始的按位运算符(
      &
      |
      等vs.)。
      • 更新:JS现在具有求幂运算符
        **
    • JS具有递增/递减、类型运算符(
      typeof
      instanceof
      )、附加赋值运算符和附加比较运算符

    • 在JS中,
      ==
      ==
      =
      ==
      运算符的优先级低于
      =
      JavaScript数组和对象比您想象的更接近。可以使用数组表示法获取其中任意一个的元素,还可以向数组添加非数字索引。单个数组元素可以容纳任何内容,并且数组可以是稀疏的。他们几乎是一模一样的表亲。

      一些细微的差别至少会让你明白一次:

      • 在Lua中拼写为
        ~=
        “不相等”。在JS中它是
        =
      • Lua-他们的第一个索引是1而不是0
      • Lua需要冒号而不是句点来调用对象方法。您编写
        a:foo()
        而不是
        a.foo()

      †如果需要,可以使用句点,但必须显式传递
      self
      变量
      a.foo(a)
      看起来有点麻烦。有关详细信息,请参阅。

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

      我喜欢这个问题和提供的答案。这两种语言在我看来更相似的其他原因:

      两者 将函数分配给变量, 可以动态构建功能,
      并定义闭包。

      测试表明,当前Javascript还返回对象,或者至少返回逻辑表达式中的字符串,如lua:

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

      在Lua中,逻辑运算符(and、or)确实返回一个参数。所有函数都可以用任意数量的参数调用;但是被调整到所需的数量(除非您使用…“额外参数”)@RCIX:see luaconf.h(在lua5.2中,也包括lparser.c和llimits.h)。Lua 5.1和Lua 5.2中的最大局部值/函数=200。lua5.1中的Max-upvalues/function=60,lua5.2中的Max-upvalues/function=255(此计数还包括函数内部创建的闭包“继承的”upvalues)。我认为您可以将基于1的数组添加到列表中,当您不习惯时,这可能会非常烦人。Lua中只有nil和false是错误的-例如,0在Lua中是真实的,但在js中不是。关于Unicode支持:Lua5.3添加了一些显式的UTF-8支持,旧的Lua版本对字符串中的UTF-8缓冲区很友好(例如,可以在字符串搜索模式中使用Unicode)。Js对UTF-8的支持并不完美,因为V8内部使用了旧的16位表示,所以您的unicode字符串可能最终会产生(令人惊讶的!)代理项对,而这在好的ol'UTF-8中是不需要的(在Lua中也不会发生)。我喜欢这个列表,但我不知道
      ~=
      如何引起微妙的错误。它可能会引发语法错误,但它们一点也不微妙。非常不同的目标包括拥有一门干净的语言。Javascript有很多历史包袱,Lua不断地丢弃不想要的东西。+1。我甚至看不出它们有什么相似之处,除了它们都用于脚本编写(这太明显了)。-1(如果我可以的话)它们在语言设计方面非常相似。Lua只是有更多的特性,而且更小(也更快?)。我认为你把语言设计和实现选择混淆了。是的,它们都是原型OOP(即使没有使用关键字
      prototype
      或nam明确说明)
      local i='foo'
      do
        local _i=1
        while _i<10 do
          local i=_i
          ...
          _i=_i+1
        end
      end
      print(i)
      
      function nix(){
          alert(arguments[0]||"0");
      } 
      nix();