Saya sangat menyukai JavaScript. Ini sangat elegan (bayangkan suara tenang dari fanboy kekasih mendesah di latar belakang).
Jadi, baru-baru ini saya bermain dengan Lua melalui kerangka löve2d (bagus!) - dan menurut saya Lua juga hebat. Menurut saya, kedua bahasa itu sangat mirip.
Ada perbedaan yang jelas, seperti
- sintaksis
- domain masalah
- perpustakaan
- jenis (sedikit)
tetapi mana yang lebih halus? Apakah ada sesuatu yang akan diterima begitu saja oleh pembuat kode JavaScript yang bekerja di Lua hanya sedikit berbeda? Apakah ada kesulitan yang mungkin tidak terlihat jelas oleh pembuat kode berpengalaman dari satu bahasa yang mencoba bahasa lainnya?
Sebagai contoh: di Lua, array dan hash tidak terpisah (hanya ada tabel) - dalam JavaScript, mereka adalah Array numerik dan Objek yang di-hash. Nah, inilah salah satu perbedaan yang lebih jelas.
Tetapi apakah ada perbedaan dalam lingkup variabel, kekekalan atau sesuatu seperti ini?
sumber
Jawaban:
Beberapa perbedaan lagi:
===
dan!==
jangan ketik juggle.^
); JS tidak. JS menggunakan operator yang berbeda, termasuk operator kondisional terner (?:
vsand/or
), dan, sebagai 5,3, operator bitwise (&
,|
, dll vs metamethods ).**
.typeof
daninstanceof
), operator penugasan tambahan, dan operator perbandingan tambahan.==
,===
,!=
dan!==
operator dari diutamakan rendah dari>
,>=
,<
,<=
. Di Lua, semua operator pembanding memiliki prioritas yang sama .getfenv
dansetfenv
di Lua 5.1 atau_ENV
di Lua 5.2 dan 5.3 .Foreach
di JS loop di atas properti objek. Foreach di Lua (yang menggunakan kata kuncifor
) melakukan loop di atas iterator dan lebih umum.Array
. Ini dapat diulang denganfor...of
sintaks. Untuk Objek biasa, seseorang dapat mengimplementasikan fungsi iteratornya sendiri. Ini membuatnya lebih dekat dengan Lua.JS memiliki ruang lingkup global dan fungsi. Lua memiliki cakupan global dan blok . Struktur kontrol (misalnya
if
,for
,while
) memperkenalkan baru blok .Karena perbedaan dalam aturan pelingkupan, referensi closure dari variabel luar (disebut "upvalues" dalam bahasa Lua) dapat ditangani secara berbeda di Lua dan Javascript . Hal ini paling sering dialami dengan penutupan dalam
for
loop , dan mengejutkan beberapa orang. Dalam Javascript , badanfor
perulangan tidak memperkenalkan ruang lingkup baru, jadi fungsi apa pun yang dideklarasikan dalam badan perulangan semuanya merujuk pada variabel luar yang sama . Dalam Lua, setiap iterasi darifor
loop membuat variabel lokal baru untuk setiap variabel loop.Kode di atas sama dengan:
Akibatnya, fungsi yang ditentukan dalam iterasi terpisah memiliki nilai naik yang berbeda untuk setiap variabel loop yang dirujuk. Lihat juga jawaban Nicolas Bola atas Pelaksanaan penutupan di Lua? dan " Apa semantik yang benar dari closure atas variabel loop? ", dan " Semantik Generik untuk ".
UPDATE : JS memiliki cakupan blok sekarang. Variabel ditentukan dengan
let
atau mengikuticonst
lingkup blok."pâté".toUpperCase()
("PÂTÉ"
). Lua 5.3 dan yang lebih baru memiliki urutan pelolosan titik kode Unicode dalam string literal (dengan sintaks yang sama seperti urutan pelolosan titik kode JavaScript) sertautf8
pustaka bawaan, yang menyediakan dukungan dasar untuk pengkodean UTF-8(seperti mengenkode poin kode ke dalam UTF-8 dan mendekode UTF-8 menjadi poin kode, mendapatkan jumlah poin kode dalam sebuah string, dan melakukan iterasi pada poin kode). String dalam Lua adalah urutan byte individu dan dapat berisi teks dalam pengkodean apa pun atau data biner sembarang. Lua tidak memiliki fungsi built-in yang menggunakan data Unicode; perilakustring.upper
bergantung pada lokal C.not
,or
,and
kata kunci yang digunakan di tempat JS 's!
,||
,&&
.~=
untuk "tidak sama", sedangkan JS menggunakan!==
. Misalnyaif foo ~= 20 then ... end
,.~
untuk XOR bitwise biner, sedangkan JS menggunakan^
.nil
danNaN
) dapat digunakan untuk mengindeks sebuah tabel. Dalam JavaScript , semua jenis non-string (kecuali Simbol) diubah menjadi string sebelum digunakan untuk mengindeks objek. Sebagai contoh, setelah evaluasi kode berikut, nilaiobj[1]
akan"string one"
di JavaScript, tetapi"number one"
di Lua:obj = {}; obj[1] = "number one"; obj["1"] = "string one";
.if
,while
dando while
pernyataan, tapi Lua tidak diif
,while
, danrepeat until
pernyataan. Misalnya,if (x = 'a') {}
adalah JS yang valid, tetapiif x = 'a' do end
Lua tidak valid.local function() end
,function t.fieldname() end
,function t:methodname() end
). JS mendeklarasikan ini dengan tanda sama dengan (let funcname = function optionalFuncname() {}
,objectname.fieldname = function () {}
).sumber
~=
bisa memicu bug halus . Itu dapat memicu kesalahan sintaks , tetapi sama sekali tidak halus.Beberapa perbedaan halus yang akan menarik perhatian Anda setidaknya satu kali:
~=
dalam Lua. Di JS itu!=
a:foo()
alih-aliha.foo()
†† Anda dapat menggunakan titik jika Anda mau, tetapi harus meneruskan
self
variabel secara eksplisit.a.foo(a)
terlihat agak rumit. Lihat Pemrograman di Lua untuk detailnya.sumber
†
untuk anotasi membuatnya tampak sepertia.foo()
telah mati xDSejujurnya akan lebih mudah untuk membuat daftar hal-hal yang umum pada Javascript dan Lua daripada membuat daftar perbedaannya. Keduanya adalah bahasa skrip yang diketik secara dinamis, tetapi sejauh itu yang Anda bisa lakukan. Mereka memiliki sintaks yang sangat berbeda, tujuan desain asli yang berbeda, mode operasi yang berbeda (Lua selalu dikompilasi ke bytecode dan dijalankan pada Lua VM, Javascript bervariasi), daftarnya terus berlanjut.
sumber
prototype
atau menamai objek objek, terlepas dari kenyataan bahwa itulah tabel lua), dengan fungsi sebagai warga kelas satu meskipun tidak berfungsi dalam pengertian tradisional (kekekalan , pengembangan deklaratif, dll.),Array dan objek JavaScript lebih dekat dari yang Anda kira. Anda dapat menggunakan notasi array untuk mendapatkan elemen dari salah satunya, dan Anda dapat menambahkan indeks non-numerik ke array. Elemen array individu bisa menampung apa saja, dan array bisa jarang. Mereka adalah sepupu yang hampir identik.
sumber
Dari atas kepala saya
Lua ...
sumber
Saya menyukai pertanyaan ini dan jawaban yang diberikan. Alasan tambahan mengapa kedua bahasa itu tampak lebih mirip bagi saya:
Keduanya menetapkan fungsi ke variabel, dapat membangun fungsi dengan cepat, dan menentukan closure.
sumber
Lua dan JavaScript adalah bahasa dasar prototipe.
sumber
Sebuah tes mengungkapkan bahwa Javascript saat ini juga mengembalikan objek, atau setidaknya string dari ekspresi logika seperti yang dilakukan lua:
sumber