代码之家  ›  专栏  ›  技术社区  ›  stefs

JavaScript和Lua之间的细微差异[已关闭]

  •  120
  • stefs  · 技术社区  · 16 年前

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

    所以,最近我和Lua通过 löve2d 框架(很好!)-我认为Lua也很棒。在我看来,这两种语言是 非常 相像的

    有明显的区别,比如

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

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

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

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

    8 回复  |  直到 12 年前
        1
  •  194
  •   WildJoe    6 年前

    还有一些区别:

    • 卢阿 coroutines .
      • :JS现在在生成器中包含yield关键字,支持协同程序。
    • doesn't convert === !== 不要打字变戏法。
    • 卢阿 具有求幂运算符( ^ ); JS 不。 使用不同的运算符,包括三元条件运算符( ?: vs and/or ),以及从5.3开始的按位运算符( & , | 等等。 metamethods ).
      • 使现代化 :JS现在具有求幂运算符 ** .
    • 具有递增/递减类型运算符( typeof instanceof ),附加赋值运算符和附加比较运算符。
    • 在里面 JS 这个 == , != 运算符的优先级低于 > , >= < , <= . 在Lua中,所有比较运算符都是 same precedence .
    • 卢阿 支持 tail calls .
    • 卢阿 assignment to a list of variables . 虽然它还不是标准的 Javascript destructuring assignment .JS中的解构更为通用,因为它可以在赋值以外的上下文中使用,例如 function definitions & calls loop initializers . Destructuring assignment 已经有一段时间被提议添加到ECMAScript(Javascript背后的语言标准)中。
      • 使现代化 :Destructuring(和Destructuring assignment)现在是ECMAScript规范的一部分-已经在许多引擎中实现。
    • 在里面 卢阿 ,你可以 overload operators .
    • 在里面 ,您可以使用 getfenv and setfenv 在Lua 5.1或 _ENV 在里面 Lua 5.2 5.3 .
    • 在里面 卢阿 ,函数必须是 explicitly declared as variadic .
    • Foreach 在里面 JS 循环对象属性。 Foreach 在里面 (使用关键字的) for )循环遍历迭代器,这更为一般。
      • :JS有 Iterables 现在,它们中的许多都内置在您期望的常规数据结构中,例如 Array for...of 语法。对于常规对象,可以实现自己的迭代器函数。这使它更接近Lua。
    • JS具有全局和功能范围。 global and block scope . 控制结构(例如:。 if , 对于 , while blocks

      • 由于作用域规则的不同,闭包对外部变量的引用(在Lua术语中称为“upvalues”)在Lua和in中的处理方式可能不同 Javascript . 这是最常见的经验 closures in for loops Javascript ,一个 循环不引入新的作用域,因此循环体中声明的所有函数都引用 same outer variables . 在Lua中,每个迭代 对于 循环为每个循环变量创建新的局部变量。

        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)
        

        因此,在单独迭代中定义的函数对于每个引用的循环变量具有不同的UPValue。另见Nicolas Bola对 Implementation of closures in Lua? 及" What are the correct semantics of a closure over a loop variable? “、和” The Semantics of the Generic for

        使现代化 let const 尊重区块范围。

    • 中的整数文本 可以是八进制。
    • 具有显式Unicode支持,内部字符串以 UTF-16 (因此它们是成对字节的序列)。各种内置JavaScript函数使用Unicode数据,例如 "pâté".toUpperCase() "PÂTÉ" ). Lua 5.3 和以上有字符串文字的Unicode代码点转义序列(与JavaScript代码点转义序列的语法相同)以及内置的 utf8 库,它为 UTF-8 encoding string.upper 取决于C语言环境。
    • 在里面 卢阿 not , or , and JS ! , || && .
    • 卢阿 ~= 表示“不相等”,而 !== . 例如 if foo ~= 20 then ... end
    • Lua 5.3 和用完 ~ JS .
    • 在里面 卢阿 nil NaN )可用于索引表。在里面 ,所有非字符串类型(符号除外)在用于索引对象之前都会转换为字符串。例如,在对以下代码求值之后 obj[1] "string one" 在JavaScript中,但是 "number one" 在卢阿: obj = {}; obj[1] = "number one"; obj["1"] = "string one"; .
    • 在里面 JS ,赋值被视为表达式,但在 卢阿 事实并非如此。因此,JS允许在 , do while 声明,但Lua不在 如果 , repeat until if (x = 'a') {} 是有效的JS,但是 if x = 'a' do end
    • 卢阿 具有用于声明块作用域函数变量、作为字段的函数和方法的语法糖( local function() end function t.fieldname() end , function t:methodname() end ). 用等号声明这些( let funcname = function optionalFuncname() {} , objectname.fieldname = function () {}
        2
  •  14
  •   richq luc    16 年前

    以下几点细微差别至少会让你明白一次:

    • ~= !=
    • 卢阿 arrays are 1-based -他们的第一个索引是1而不是0。
    • Lua需要冒号而不是句点来调用对象方法。你写 a:foo() a.foo()

    如果需要,可以使用句点,但必须通过 self 变量。 a.foo(a) 看起来有点笨重。看见 Programming in Lua 详情请参阅。

        3
  •  12
  •   DaveR    16 年前

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

        4
  •  8
  •   Nosredna    16 年前

        5
  •  4
  •   WeakPointer    14 年前

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

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

        6
  •  3
  •   jitter    16 年前

    卢阿。。。

    1. coroutines
    2. 不限制将字符串/数字作为表的键。一切正常。
    3. 错误处理有些笨拙。要么你不处理任何事情,要么使用 pcall 方法
    4. 我想我读到了一些关于词汇范围差异的东西,Lua有更好的。
    5. 如果我没记错的话,lua中对正则表达式的支持是有限的
        7
  •  2
  •   anonymous anonymous    16 年前

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

        8
  •  1
  •   Adder    13 年前

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

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