2009-06-20 121 views
111

我只是喜歡JavaScript。這是如此的優雅(想象一下在後臺歎爲觀止的癡迷者的安靜聲音)。JavaScript和Lua之間的細微差異

因此,最近我通過löve2d框架(好!)和Lua一起玩過 - 我覺得Lua也很棒。他們的方式我看到它,那兩種語言都很非常類似於

有明顯的差異,像

  • 語法
  • 問題域
  • 類型(位)

但有更微妙的呢?有沒有什麼JavaScript編碼器理所當然的適用於Lua,只是略有不同?對於有經驗的一種語言的編碼器,嘗試另一種語言的編碼器可能並不明顯嗎?

例如:在Lua中,數組和哈希不是分離的(只有表) - 在JavaScript中,它們是數值數組和哈希對象。那麼,這是一個更明顯的差異。

但是,變量的範圍,不變性或類似的東西是否存在差異?

+15

1爲「(想象癡情想說我嘆氣在後檯安靜的聲音)。」 – UnkwnTech 2009-06-20 23:26:11

+8

對於像我這樣的人來說,他們在尋找一個整體比較,並在這裏偶然發現,下面是一個很好的概述:http://phrogz.net/lua/LearningLua_FromJS.html – Tao 2012-05-02 10:55:29

+0

Javascript和優雅不應該在同樣的句子! – Matt 2017-12-14 09:46:06

回答

165

一些更多的差異:

  • 的Luacoroutines的原生支持。
    • UPDATE:JS現在包含內發電機的產量關鍵字,給它的協同程序支持。
  • luadoesn't convert不同類型之間的任何比較運算符。在JS中,只有===!==不能打字。
  • Lua有一個指數運算符(^); JS沒有。 JS使用不同的運算符,包括三元條件運算符(?: vs and/or),以及5.3中的按位運算符(&,|等與metamethods)。
    • UPDATE:JS現在有指數運算符**
  • JS具有遞增/遞減,運營商類型(typeofinstanceof),附加的賦值運算符和附加比較運算符。
  • JS,所述=====!=!==運營商比>>=<<=低優先級的。在Lua中,所有比較運算符是same precedence
  • Lua支持tail calls
  • Lua支持assignment to a list of variables。儘管它尚未成爲標準,但在Mozilla的JS引擎(和Opera's,在某種程度上)已支持自JS 1.7(可作爲Firefox 2的一部分)以「destructuring assignment」名稱提供的類似功能。 JS中的解構更加通用,因爲它可以用於除賦值之外的上下文中,如function definitions & callsloop initializersDestructuring assignment一直是對ECMAScript(JavaScript背後的語言標準)的一個提議。
    • UPDATE:解構(和解構賦值)現在是ECMAScript規範的一部分 - 已經在許多引擎中實現了。
  • Lua,你可以overload operators
  • 的Lua,你可以用manipulate environmentsgetfenv & setfenv
  • JS,所有功能都是可變的。在Lua中,函數必須是explicitly declared as variadic
  • Foreach in JS在對象屬性上循環。Foreach的Lua(其使用關鍵字for)遍歷迭代器和更通用。
    • UPDATE:JS有Iterables現在也一樣,其中有許多是內置到你所期望的常規數據結構,如Array。這些可以使用for...of語法循環。對於常規對象,可以實現自己的迭代器函數。這使它更接近Lua。
  • JS具有全局和功能範圍。 Luaglobal and block scope。控制結構(例如ifforwhile)引入新的blocks

    • 由於作用域規則的差異,外部變量的封閉的引用(稱爲在Lua用語「upvalues」)可以在不同的Lua和在的Javascript處理。這是closures in for loops最常遇到的情況,並且讓一些人感到意外。在的Javascript,一個for循環體不引入新的範圍,所以在循環體中聲明的任何函數都引用same outer variables。在Lua中,for循環的每次迭代爲每個循環變量創建新的局部變量。

      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) 
      

      因此,在單獨的迭代定義的函數具有用於每個引用的循環變量不同upvalues。又見薩科博拉的答案Implementation of closures in Lua?和「What are the correct semantics of a closure over a loop variable?」,和「The Semantics of the Generic for」。

      UPDATE:JS現在已經封鎖範圍。使用letconst來定義的變量會遵守塊範圍。在JS

  • 整數常量可以在八進制。
  • JS有明確的Unicode支持。
  • Lua,~被用來代替!。 (如,if foo ~= 20 then ... end)(技術上的語法,但很容易被忽略,並導致微妙的錯誤)。
  • Luanot/or/and關鍵字被用來代替!/||/&&(也是語法,但也很容易被遺忘)。
  • Lua,可以使用任何類型的值(除了nilNaN)來索引表;在JavaScript中,對象索引轉換爲字符串。
  • JS,作業被視爲表達式,但在Lua他們不是。因此,JS允許在條件爲if,whiledo while聲明中進行分配,但Lua不在if,whilerepeat until聲明中。例如,if (x = 'a') {}是有效的JS,但if x = 'a' do end是無效的Lua。
11

說實話,列出Javascript和Lua常見的東西比列出差異更容易。它們都是動態類型的腳本語言,但只要你真的可以這樣做。它們具有完全不同的語法,不同的原始設計目標,不同的操作模式(Lua總是編譯爲字節碼並在Lua VM上運行,Javascript變化),列表依然如此。

+5

絕對。非常不同的目標包括高度重視擁有乾淨的語言。 Javascript有很多歷史包袱,Lua不斷丟棄任何不受歡迎的東西。 – Javier 2009-06-20 23:07:12

+3

+1。我什至不知道它們是如何相似的,除了它們都用於腳本(這太明顯了)。 – 2009-06-21 01:59:18

+12

-1(如果可以的話)他們在語言設計方面非常相似。 Lua只是有更多的功能,而且更小(也更快?)。我認爲你把語言設計和執行選擇混爲一談。 – jpc 2011-04-21 10:36:32

2

把我的頭

的Lua的頂部...

  1. 支持coroutines
  2. 沒有限制,只是字符串/數字作爲一個表項。一切正常。
  3. 錯誤處理有點笨拙。或者你不處理任何東西或者使用pcall方法
  4. 我想我讀了一些關於詞法範圍差異的東西,而且Lua有更好的一個。
  5. 如果我記得在Lua正確的正則表達式的支持僅限
7

JavaScript數組和對象比您想象的要近。您可以使用數組表示法來獲取它們中的任何一個的元素,並且可以將非數字索引添加到數組中。單獨的數組元素可以容納任何東西,並且數組可以是稀疏的。他們幾乎是相同的堂兄弟。

8

幾個細微的差別,將抓住你至少一次:

  • 不等於在Lua中被拼寫~=。在JS它是!=
  • 的Lua arrays are 1-based - 他們的第一索引爲1而不是0。
  • 的Lua需要結腸,而不是一段時間來調用對象的方法。你寫a:foo()而不是a.foo()&dagger;

&dagger;如果需要,您可以使用句點,但必須明確傳遞self變量。 a.foo(a)看起來有點麻煩。詳細信息請參見Programming in Lua

0

Lua和JavaScript都是原型基礎語言。

3

我喜歡這個問題,並提供答案。另外的原因,這兩種語言比似乎沒有更相似對我說:

兩個 功能分配變量, 可以動態創建功能, 和定義關閉。

1

的試驗表明,電流的Javascript也返回的對象,或者在從邏輯表達式至少串等LUA作用:

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