jjzjj

javascript - JavaScript 和 Lua 之间的细微差别

coder 2023-07-03 原文

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

2年前关闭。



Improve this question




我只是喜欢 JavaScript。它是如此优雅(想象一下在背景中迷恋粉丝叹息的安静声音)。

所以,最近我通过 löve2d 玩了 Lua。框架(不错!) - 我认为 Lua 也很棒。在我看来,这两种语言非常相似。

有明显的区别,比如

  • 语法
  • 问题域
  • 图书馆
  • 类型(有点)

  • 但哪些是更微妙的?有什么 JavaScript 编码员会认为在 Lua 中工作的东西是理所当然的,只是略有不同?对于尝试另一种语言的经验丰富的编码人员来说,是否有任何陷阱可能并不明显?

    例如:在 Lua 中,数组和哈希不是分开的(只有表格)——在 JavaScript 中,它们是数字数组和哈希对象。嗯,这是更明显的差异之一。

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

    最佳答案

    更多不同点:

  • Lua 原生支持 coroutines .
  • 更新 : JS 现在在生成器中包含 yield 关键字,从而支持协程。
  • Lua doesn't convert任何比较运算符的类型之间。在JS中,只有===!==不要打杂耍。
  • Lua 有一个取幂运算符 ( ^ ); JS没有。 JS 使用不同的运算符,包括三元条件运算符( ?:and/or ),以及从 5.3 开始,按位运算符( &| 等与 metamethods )。
  • 更新 : JS 现在有求幂运算符 ** .
  • JS 有递增/递减、类型操作符( typeofinstanceof )、额外的赋值操作符和额外的比较操作符。
  • 在 JS 中,== , === , !=!==运算符的优先级低于 > , >= , < , <= .在 Lua 中,所有的比较运算符都是 same precedence .
  • Lua 支持 tail calls .
  • 更新 : JS 现在 supports tail calls .
  • Lua 支持 assignment to a list of variables .虽然它还不是 Javascript 的标准,但 Mozilla 的 JS 引擎(和 Opera 的,在一定程度上)自 JS 1.7(作为 Firefox 2 的一部分提供)以“destructuring assignment”的名称支持类似的功能。 JS 中的解构更通用,因为它可以用于赋值以外的上下文,例如 function definitions & callsloop initializers . Destructuring assignment一段时间以来,它一直被提议添加到 ECMAScript(Javascript 背后的语言标准)中。
  • 更新 :解构(和解构赋值)现在是 ECMAScript 规范的一部分 - 已经在许多引擎中实现。
  • 在 Lua 中,你可以 overload operators .
  • 在 Lua 中,您可以使用 getfenv and setfenv 操作环境在 Lua 5.1 或 _ENV 中在 Lua 5.25.3 .
  • 在 JS 中,所有函数都是可变参数的。在 Lua 中,函数必须是 explicitly declared as variadic .
  • Foreach在 JS 中循环对象属性。 Foreach在 Lua 中(使用关键字 for )循环遍历迭代器并且更通用。
  • 更新 : JS 有 Iterables现在也是如此,其中许多都内置在您期望的常规数据结构中,例如 Array .这些可以用 for...of 循环。语法。对于常规对象,可以实现自己的迭代器函数。这使它更接近 Lua。
  • JS 有全局作用域和函数作用域。 Lua 有 global and block scope .控制结构(例如 ifforwhile )引入了新的 blocks .
  • 由于作用域规则的不同,闭包对外部变量(在 Lua 中称为“upvalues”)的引用在 Lua 和 Javascript 中的处理方式可能不同。这是最常见的体验 closures in for loops ,让一些人大吃一惊。在 Javascript 中,for 的主体loop 不会引入新的作用域,因此在循环体中声明的任何函数都引用了 same outer variables .在 Lua 中,for 的每次迭代loop 为每个循环变量创建新的局部变量。
    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)
    

    因此,在单独迭代中定义的函数对于每个引用的循环变量具有不同的上值。另见 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”。

    更新 : JS 现在有块作用域。用 let 定义的变量或 const尊重块范围。
  • JS 中的整数文字可以是八进制的。
  • JS 有明确的 Unicode 支持,内部字符串编码为 UTF-16 (所以它们是字节对的序列)。各种内置的 JavaScript 函数使用 Unicode 数据,例如 "pâté".toUpperCase() ( "PÂTÉ" )。 Lua 5.3 及更高版本在字符串文字中具有 Unicode 代码点转义序列(与 JavaScript 代码点转义序列的语法相同)以及内置的 utf8库,为 UTF-8 encoding 提供基本支持(例如将代码点编码为 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 除外)在用于索引对象之前都会转换为字符串。例如,在评估以下代码后,obj[1] 的值将是 "string one"在 JavaScript 中,但是 "number one"在 Lua 中:obj = {}; obj[1] = "number one"; obj["1"] = "string one"; .
  • 在 JS 中,赋值被视为表达式,但在 Lua 中它们不是。因此,JS 允许在 if 的条件下赋值, while , 和 do while声明,但 Lua 不在 if , while , 和 repeat until声明。例如,if (x = 'a') {}是有效的 JS,但 if x = 'a' do end是无效的 Lua。
  • Lua 具有用于声明块作用域函数变量、作为字段的函数和方法( local function() endfunction t.fieldname() endfunction t:methodname() end )的语法糖。 JS 用等号( let funcname = function optionalFuncname() {}objectname.fieldname = function () {} )声明这些。
  • 关于javascript - JavaScript 和 Lua 之间的细微差别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1022560/

    有关javascript - JavaScript 和 Lua 之间的细微差别的更多相关文章

    1. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

      我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

    2. ruby-on-rails - Rails 应用程序之间的通信 - 2

      我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

    3. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

      在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

    4. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

      我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

    5. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

      ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

    6. [工业相机] 分辨率、精度和公差之间的关系 - 2

      📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

    7. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

      我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

    8. ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别 - 2

      由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A

    9. ruby - 在模块/类之间共享全局记录器 - 2

      在许多ruby​​类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..

    10. ruby - 在两个 ActiveRecord 类之间合并/复制属性的好方法? - 2

      之前有人问过这个问题,我发现了以下clip关于如何一次设置一个类对象的所有属性,但由于批量分配保护,这在Rails中是不可能的。(例如,您不能Object.attributes={})有没有一种很好的方法可以将一个类的属性合并到另一个类中?object1.attributes=object2.attributes.inject({}){|h,(k,v)|h[k]=vifObjectModel.column_names.include?(k);h}谢谢。 最佳答案 利用assign_attributes使用:without_prote

    随机推荐