JavaScript ve Lua arasındaki ince farklar [kapalı]


121

JavaScript'i çok seviyorum. O kadar zarif ki (arka planda içini çeken aşık aşık hayranın sessiz sesini hayal edin).

Son zamanlarda Lua ile löve2d çerçevesi (güzel!) Üzerinden oynadım - ve Lua'nın da harika olduğunu düşünüyorum. Gördüğüm gibi, bu iki dil birbirine çok benziyor.

Gibi bariz farklılıklar var

  • sözdizimi
  • problem alanı
  • kütüphaneler
  • türleri (biraz)

ama hangileri daha incelikli olanlar? Lua'da biraz farklı çalışan bir JavaScript kodlayıcının kabul edeceği herhangi bir şey var mı? Bir dilin diğerini deneyen deneyimli kodlayıcılarının aşikar olmayabileceği tuzaklar var mı?

Örneğin: Lua'da diziler ve karmalar ayrı değildir (yalnızca tablolar vardır) - JavaScript'te bunlar sayısal Diziler ve hashing uygulanmış Nesnelerdir. Eh, bu daha bariz farklılıklardan biridir.

Ancak değişken kapsam, değişmezlik veya bunun gibi bir şeyde farklılıklar var mı?


8
Benim gibi, genel bir karşılaştırma arayan ve kazayla buraya gelenler için, aşağıdaki güzel bir genel bakış: phrogz.net/lua/LearningLua_FromJS.html
Tao

Bu Başlamak bilmek size ihtiyacınız olan tüm farklılıkları açıklayan üç bölümlük dizi: oreilly.com/learning/...
charAt

Yanıtlar:


189

Bazı farklılıklar:

  • Lua , koroutinler için yerel desteğe sahiptir .
    • GÜNCELLEME : JS artık üreteçlerin içinde getiri anahtar sözcüğünü içeriyor ve bu anahtar sözcüğe eş anlamlılar için destek veriyor.
  • Lua , herhangi bir karşılaştırma operatörü için türler arasında dönüştürme yapmaz . JS olarak, sadece ===ve !==hokkabazlık yazmayın.
  • Lua'nın üs alma operatörü ( ^) vardır; JS yapmaz. JS üçlü koşullu operatör (dahil olmak üzere farklı operatörler kullanır ?:vs and/or5.3, bit operatörleri (itibariyle) ve &, |vb genel metamethods ).
    • GÜNCELLEME : JS'de artık üs alma operatörü var **.
  • JS'de artırma / azaltma, tür operatörleri ( typeofve instanceof), ek atama operatörleri ve ek karşılaştırma operatörleri bulunur.
  • Gelen JS , ==, ===, !=ve !==operatörler daha düşük önceliğe sahiptir >, >=, <, <=. Lua'da, tüm karşılaştırma operatörleri aynı önceliğe sahiptir .
  • Lua , kuyruk aramalarını destekler .
  • Lua , bir değişkenler listesine atamayı destekler . Henüz Javascript'te standart olmasa da , Mozilla'nın JS motoru (ve bir dereceye kadar Opera'nın) " yıkıcı atama " adı altında JS 1.7'den (Firefox 2'nin bir parçası olarak mevcuttur) benzer bir özelliği destekledi . JS'de yıkım, işlev tanımları ve çağrılar ve döngü başlatıcılar gibi atama dışındaki bağlamlarda kullanılabileceğinden daha geneldir . Yıkıcı görev , bir süredir ECMAScript'e (Javascript'in arkasındaki dil standardı) önerilen bir ek olmuştur.
    • GÜNCELLEME : Yıkma (ve tahrip etme ataması) artık ECMAScript spesifikasyonunun bir parçasıdır - zaten birçok motorda uygulanmıştır.
  • In Lua yapabilirsiniz operatörleri aşırı .
  • In Lua , sizinle ortamları manipüle edebilir getfenvvesetfenv Lua 5.1 veya _ENViçinde Lua 5.2 ve 5.3 .
  • In JS , tüm fonksiyonlar variadic bulunmaktadır. In Lua , fonksiyonlar olmalıdır açıkça variadic olarak ilan .
  • Foreachiçinde JS nesne özellikleri üzerinde döngüler. SayfaForeach içinde Lua (anahtar kelime kullanmak for) yineleyicileri üzerinden döngüler ve daha geneldir.
    • GÜNCELLEME : JS'de artık yineleyiciler de var, bunların çoğu beklediğiniz gibi normal veri yapılarına yerleştirilmiştir Array. Bunlar for...ofsözdizimi ile çevrilebilir. Normal Nesneler için, kendi yineleme işlevlerini uygulayabilirsiniz. Bu onu Lua'ya çok daha yaklaştırır.
  • JS'nin genel ve işlev kapsamı vardır. Lua sahiptir küresel ve blok kapsamını . Kontrol yapıları (örneğin if, for, while) yeni tanıtmak blokları .

    • Kapsam belirleme kurallarındaki farklılıklardan dolayı, bir dış değişkene (Lua dilinde "upvalues" adı verilen) bir kapatmanın referansı Lua'da ve Javascript'te farklı şekilde ele alınabilir . Bu, en yaygın olarak döngülerin kapanmasıylafor yaşanır ve bazı insanları şaşırtarak yakalar. In JavaScript , bir vücut forherhangi fonksiyonları tüm referansı döngü gövdesinde ilan böylece döngü, yeni bir kapsam tanıtmak gelmez aynı dış değişkenleri . Lua'da, fordöngünün her yinelemesi, her döngü değişkeni için yeni yerel değişkenler oluşturur.

      local i='foo'
      for i=1,10 do
        -- "i" here is not the local "i" declared above
        ...
      end
      print(i) -- prints 'foo'

      Yukarıdaki kod şuna eşdeğerdir:

      local i='foo'
      do
        local _i=1
        while _i<10 do
          local i=_i
          ...
          _i=_i+1
        end
      end
      print(i)

      Sonuç olarak, ayrı yinelemelerde tanımlanan işlevler, başvurulan her döngü değişkeni için farklı yukarı değerlere sahiptir. Ayrıca bkz. Nicolas Bola'nın Lua'da kapatma uygulamasına verdiği yanıtlar ? ve " Bir döngü değişkeni üzerinden bir kapanışın doğru semantiği nelerdir? " ve " için Generic'in Anlambilimi ".

      GÜNCELLEME : JS'nin artık blok kapsamı var. Blok kapsamıyla tanımlanan letveya constbunlara uyan değişkenler .

  • İçinde tamsayı değişmezleri JS sekizlik olabilir.
  • JS'nin açık Unicode desteği vardır ve dahili olarak dizeler UTF-16 olarak kodlanmıştır (bu nedenle bunlar bayt çiftlerinin dizileridir). Çeşitli yerleşik JavaScript işlevleri, "pâté".toUpperCase()( "PÂTÉ") gibi Unicode verilerini kullanır . Lua 5.3 ve üzeri, dize değişmezlerinde (JavaScript kod noktası kaçış dizileriyle aynı sözdizimine sahip) Unicode kod noktası kaçış dizilerine utf8ve UTF-8 kodlaması için temel destek sağlayan yerleşik kitaplığa sahiptir.(kod noktalarını UTF-8'e kodlamak ve UTF-8'i kod noktalarına kodlamak, bir dizedeki kod noktalarının sayısını almak ve kod noktaları üzerinde yineleme yapmak gibi). Lua'daki dizeler, ayrı bayt dizileridir ve herhangi bir kodlamada metin veya rastgele ikili veriler içerebilir. Lua'nın Unicode verilerini kullanan yerleşik işlevleri yoktur; davranışı string.upperC yerel ayarına bağlıdır.
  • In Lua , not, or, andanahtar kelimeler yerine kullanılan JS 's !, ||, &&.
  • Lua kullanır ~=ise, "eşit değil" için JS kullanımları !==. Örneğin if foo ~= 20 then ... end,.
  • Lua 5.3 ve üstü kullanım ~oysa ikili bitsel XOR için, JS kullanımları ^.
  • Gelen Lua değer (hariç herhangi bir tür nilve NaN) dizin için bir tablo kullanılabilmektedir. In JavaScript , (Sembol hariç) olmayan tüm dize türleri endeksine bir nesne kullanılmadan önce dizeleri dönüştürülür. Örneğin, aşağıdaki kod değerlendirmesinden sonra, değeri obj[1]olacak "string one"ama, JavaScript "number one"Lua: obj = {}; obj[1] = "number one"; obj["1"] = "string one";.
  • In JS , ödevler ifadeler olarak kabul edilir, ancak Lua değiller. Böylece, JS koşullarında atamaları verir if, whileve do whiletabloların, ancak Lua içinde değil if, whileve repeat untilbildirimler. Örneğin, if (x = 'a') {}JS geçerlidir, ancak if x = 'a' do endgeçersiz Lua'dır.
  • Lua blok kapsamlı fonksiyon değişkenleri, alanlar işlevlerini bildirmek için sözdizimsel şekeri ve yöntemleri ( local function() end, function t.fieldname() end, function t:methodname() end). JS bunları bir eşittir işaretiyle ( let funcname = function optionalFuncname() {}, objectname.fieldname = function () {}) bildirir .

6
Lua'da mantıksal operatörler (ve, veya) argümanlardan birini döndürür. tüm işlevler herhangi bir sayıda parametre ile çağrılabilir; ancak gerekli sayıya ayarlandı (... 'ekstra argümanlar' kullanmadığınız sürece)
Javier

1
@RCIX: bkz. Luaconf.h (ve Lua 5.2'de, ayrıca lparser.c ve llimits.h). Maks yerel değerler / fonksiyon = Lua 5.1 ve Lua 5.2'de 200. Maks. Yukarı değerler / fonksiyon = Lua 5.1'de 60, Lua 5.2'de 255 (ve bu sayı aynı zamanda fonksiyon içinde yaratılan kapanmalar tarafından "miras alınan" yukarı değerleri de içerir).
şüphelijim

8
Listeye 1 tabanlı diziler ekleyebileceğinizi düşünüyorum, alışmadığınız zaman oldukça can sıkıcı olabilir.
Yann

2
Lua'da yalnızca sıfır ve yanlış yanlıştır - bu nedenle, örneğin, 0 Lua'da doğrudur, ancak js'de değildir. Unicode desteği hakkında: Lua 5.3, bazı açık UTF-8 desteği ekler ve daha eski Lua sürümleri, dizelerde tutulan UTF-8 arabelleklerine dosttur (örneğin, dizi arama modellerinde Unicode kullanabilirsiniz). UTF-8 için Js desteği, V8 dahili olarak eski bir 16-bit gösterimi kullandığından mükemmel değildir, bu nedenle unicode dizeleriniz iyi UTF-8'de gerekmeyen (sürpriz!) Vekil çiftlerle sonuçlanabilir (ve Lua'da olmaz).
Tyler

4
Bu listeye bayıldım, ancak ince böcekleri nasıl ~=kışkırtabileceğimi bilmiyorum . Sözdizimi hatalarına neden olabilir , ancak bunlar hiç de ince değildir.
kikito

12

Sizi en az bir kez yakalayacak birkaç ince farklılık:

  • Lua'da eşit değildir ~=. JS'de!=
  • Lua dizileri 1 tabanlıdır - ilk dizini 0 yerine 1'dir.
  • Lua, nesne yöntemlerini çağırmak için nokta yerine iki nokta üst üste gerektirir. a:foo() yerine yazarsına.foo()

İsterseniz nokta kullanabilirsiniz, ancak selfdeğişkeni açıkça iletmeniz gerekir. a.foo(a)biraz hantal görünüyor. Ayrıntılar için Lua'da Programlama konusuna bakın .


5
ek açıklama için kullanmak a.foo()xD ölmüş gibi görünüyor
DarkWiiPlayer

11

Dürüst olmak gerekirse, Javascript ve Lua'da ortak olan şeyleri listelemek, farklılıkları listelemekten daha kolay olacaktır. Her ikisi de dinamik olarak yazılmış betik dilleridir, ancak bu gerçekten gidebileceğiniz kadarıyla ilgilidir. Tamamen farklı sözdizimlerine, farklı orijinal tasarım hedeflerine, farklı çalışma modlarına (Lua her zaman bayt koduna göre derlenir ve Lua VM'de çalıştırılır, Javascript değişir), liste uzayıp gider.


8
kesinlikle. çok farklı hedefler, temiz bir dile sahip olmak için yüksek bir öncelik içerir. Javascript çok sayıda tarihi bagaja sahiptir, Lua sürekli olarak istenmeyen her şeyi bırakır.
Javier

3
+1. Her ikisinin de komut dosyası oluşturmak için kullanılması dışında (ki bu çok açık) ne kadar benzer olduklarını bile anlamıyorum.
Sasha Chedygov

13
-1 (yapabilseydim) Dil tasarımı cephesinde çok benzerler. Lua daha fazla özelliğe sahiptir ve daha küçüktür (ayrıca daha hızlıdır?). Bence dil tasarımını uygulama seçenekleriyle karıştırıyorsunuz.
jpc

Evet, her ikisi de prototip OOP'dur ( prototypelua tabloları tam olarak bu olmasına rağmen, anahtar kelime kullanarak veya nesneleri adlandırırken açıkça belirtilmemiş olsa bile ), geleneksel anlamda işlevsel olmamasına rağmen birinci sınıf vatandaş olarak işlev görür (değişmezlik , bildirim geliştirme vb.),
Bojan Markovic

2
Elbette sözdizimsel farklılıklar var ve buna yüzeysel olarak bakarsanız, dillerin farklı olduğu sonucuna varabilirsiniz. Bununla birlikte , tam olarak aynı ana veri türüne (nesne / tablo) ve sınıfları ve kalıtımı uygulamanın aynı yoluna sahip olmak ( çok az başka dilin paylaştığı bir şey ), onları ruh olarak inanılmaz derecede yakın hale getirir. Önemsiz olmayan JS programının tasarımı, bir Lua programıyla hemen hemen aynı olacaktır.
Alex Gian

7

JavaScript dizileri ve nesneleri düşündüğünüzden daha yakın. İkisinin de öğelerine ulaşmak için dizi gösterimini kullanabilir ve dizilere sayısal olmayan indisler ekleyebilirsiniz. Bağımsız dizi öğeleri her şeyi tutabilir ve dizi seyrek olabilir. Neredeyse aynı kuzenlerdir.


1
Birinin aynı kuzenleri olabilir mi?
jameshfisher

Aynı veri yapısına sahipler, tek fark, onları ayırt edebilmeniz için tip tanımlayıcısıdır.
Lilith River

5
Daha doğru bir ifade şöyle olacaktır: Diziler, "uzunluk" üyelerinin özel davranışına sahip Nesnelerdir.
tzenes

@eegg: elbette, Cathy ve Patty .
outis

3

Kafamın üstünden

Lua ...

  1. eşgüdümleri destekler
  2. bir tablonun anahtarı olarak sadece dizge / sayı sınırlaması yoktur. Herşey çalışıyor.
  3. hata işleme biraz beceriksizdir. Ya hiçbir şey yapmazsınız ya da pcall yöntemini kullanırsınız
  4. Sözcük kapsamındaki farklılıklar hakkında bir şeyler okuduğumu ve Lua'nın daha iyisine sahip olduğunu düşünüyorum.
  5. Doğru hatırlıyorsam lua'da düzenli ifade desteği sınırlıdır

Lua yapar sözcük kapsamı var. JavaScript yalnızca işlev kapsamına sahiptir. Pekala, Mozilla ve Rhino'da artık 'var' yerine 'let'i kullanabilir ve uygun sözcük kapsamını elde edebilirsiniz; ancak henüz taşınabilir değil.
Javier

1
Lua'nın standart dizgi kitaplığı sınırlı kalıp eşleştirme işlevleri içerir; ama aynı zamanda tam bir gramer için kolayca kullanılabilen çok daha güçlü bir eşleştirme sistemi sağlayan LPEG (ayrıca bir kitaplık) var.
Javier

LUA'nın "daha iyi" sözcük kapsamı olduğunu, javascript'in olmadığı için javascript'e sahip olduğunu belirttim.
titreşim

1
LPEG ek bir kitaplıktır, bu da temel düzenli ifade desteğinin benimle sınırlı olduğu anlamına gelir
seğirme

Dize anahtarları ve sayı anahtarları arasında bir miktar kısıtlama vardır, aynı tabloda her ikisinin de kullanılması çok hızlı bir şekilde dağınık hale gelir, çünkü # numaralandırılmış dizinlerin miktarıyla değil, tablo uzunluğunu döndürür, bu da herhangi bir sözlük girişiyle çakışır (numaralandırıldıktan sonra indeksleme sıfır tablo indeksleri)
Weeve Ferrelaine

3

Bu soruyu ve verilen cevapları beğendim. İki dilin bana hiç benzemediğinden daha fazla benzemesinin başka nedenleri:

Her ikisi de değişkenlere işlev atar, anında işlevler oluşturabilir ve kapanışları tanımlayabilir.


1

Lua ve JavaScript, prototip temel dillerdir.


1
Bu, iki dil arasındaki bariz benzerliktir, bu ve ana veri türü olarak tablo / karma kullanımları. Deyimsel olarak bir Javascript programı geliştirecek olsaydınız, Lua'da olduğu gibi hemen hemen aynı yaklaşımı kullanırdınız. Aynı şeyi başka bir dilde yapmazsınız (protype mirasına ve tablolara dayalı bir dil olmadığı sürece). Bu çok büyük bir benzerlik. Geri kalanı, küçük sözdizimi hakkındaki ayrıntılar ve benzerleri karşılaştırıldığında oldukça bilgiçlik gösterir.
Alex Gian

1
Önemli farklılıklar, Jaavscript'in eş anlamlıları desteklememesi, C ile çok sıkı bir şekilde birleştirilmemesi ve gömülü bir dil olarak gerçekten uygun olmamasıdır. (JavaScript programlanır kaç mikrokontrolörler?) JavaScript eski Sorunlar ve WATS (tonlarca de çok kötü olması destroyallsoftware.com/talks/wat ) - 1:40 ila. Lua güzel bir Spartalı disiplini empoze etti. Elbette Javascript tarayıcıda çok güçlü.
Alex Gian

1

Bir test, mevcut Javascript'in de nesneleri veya en azından lua'nın yaptığı gibi mantık ifadelerinden dizeler döndürdüğünü ortaya çıkarır:

function nix(){
    alert(arguments[0]||"0");
} 
nix();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.