जावास्क्रिप्ट और लुआ के बीच सूक्ष्म अंतर [बंद]


121

मैं बस जावास्क्रिप्ट प्यार करता हूँ। यह बहुत खूबसूरत है (बैकग्राउंड में बोए जाने वाले लवस्ट्रेक फैनबॉय की शांत आवाज़ की कल्पना करें)।

इसलिए, हाल ही में मैंने Löve2d फ्रेमवर्क (अच्छा!) के माध्यम से लुआ के साथ खेला है - और मुझे लगता है कि लुआ भी महान है। वे जिस तरह से मुझे देखते हैं, वे दो भाषाएँ बहुत समान हैं।

स्पष्ट अंतर हैं, जैसे

  • वाक्य - विन्यास
  • समस्या डोमेन
  • पुस्तकालयों
  • प्रकार (थोड़ा)

लेकिन जो अधिक सूक्ष्म हैं? क्या कोई जावास्क्रिप्ट कोडर है जो लूआ में काम करने के लिए थोड़ा अलग है? क्या ऐसी कोई कमी है जो एक भाषा के अनुभवी कोडर को स्पष्ट नहीं हो सकती जो दूसरे को आजमा रहा है?

उदाहरण के लिए: लुआ में, सरणियाँ और हैश अलग नहीं हैं (केवल टेबल हैं) - जावास्क्रिप्ट में, वे संख्यात्मक एरर्स और हैश ऑब्जेक्ट हैं। खैर, यह अधिक स्पष्ट अंतरों में से एक है।

लेकिन क्या चर दायरे, अपरिवर्तनशीलता या इस तरह से कुछ अंतर हैं?


8
उन लोगों के लिए, जो मेरी तरह हैं, जो एक समग्र तुलना की तलाश में थे और दुर्घटना से यहाँ समाप्त हो गए, निम्नलिखित एक अच्छा अवलोकन है: phrogz.net/lua/LearningLua_FromJS.html
ताओ

: यह शुरू करने के लिए पता करने के लिए आप की आवश्यकता होगी सभी मतभेदों को समझा एक तीन भाग श्रृंखला है oreilly.com/learning/...
charAt

जवाबों:


189

कुछ और अंतर:

  • लुआ को कोरटाइन के लिए मूल समर्थन है ।
    • अद्यतन : जेएस में अब जेनेरेटरों के अंदर उपज कीवर्ड होता है, जो इसे कोरआउट के लिए समर्थन देता है।
  • लुआ किसी भी तुलना ऑपरेटर के लिए प्रकारों के बीच परिवर्तित नहीं होता है । जेएस में, केवल ===और !==बाजीगरी टाइप न करें।
  • लुआ में एक घातांक ऑपरेटर ( ^) है; जेएस नहीं है। जेएस विभिन्न ऑपरेटरों का उपयोग करता है, जिसमें टर्नरी सशर्त ऑपरेटर ( ?:बनाम and/or), और 5.3 के रूप में, बिटवाइज़ ऑपरेटर ( &, |बनाम बनाम मेटामेथोड्स ) शामिल हैं।
    • अद्यतन : जेएस अब प्रतिपादक ऑपरेटर है **
  • JS में वेतन वृद्धि / वेतन वृद्धि, टाइप ऑपरेटर ( typeofऔर instanceof), अतिरिक्त असाइनमेंट ऑपरेटर और अतिरिक्त तुलना ऑपरेटर हैं।
  • में जे एस , ==, ===, !=और !==ऑपरेटरों की तुलना में कम वरीयता का कर रहे हैं >, >=, <, <=। लुआ में, सभी तुलना ऑपरेटर एक ही मिसाल हैं
  • लुआ टेल कॉल का समर्थन करता है
  • Lua चर की सूची में असाइनमेंट का समर्थन करता है । हालांकि यह अभी तक में मानक नहीं है जावास्क्रिप्ट , मोज़िला जे एस इंजन (और ओपेरा, एक हद तक) जे एस 1.7 के बाद से एक समान सुविधा (उपलब्ध फ़ायरफ़ॉक्स 2 का हिस्सा है) नाम के तहत "का समर्थन किया है काम destructuring "। जेएस में विनाशकारी अधिक सामान्य है, क्योंकि यह असाइनमेंट के अलावा अन्य संदर्भों में उपयोग किया जा सकता है, जैसे कि फ़ंक्शन परिभाषाएं और कॉल और लूप इनिशियलाइज़रकुछ समय के लिए विनाशकारी असाइनमेंट ECMAScript (जावास्क्रिप्ट के पीछे की भाषा मानक) के लिए एक प्रस्तावित अतिरिक्त है।
    • अद्यतन : विनाशकारी (और विनाशकारी असाइनमेंट) अब ECMAScript की कल्पना का हिस्सा है - जो पहले से ही कई इंजनों में लागू है।
  • में लुआ , आप कर सकते हैं ऑपरेटरों को ओवरलोड
  • में लुआ , आप के साथ वातावरण में हेरफेर कर सकते हैं getfenvऔरsetfenv लुआ 5.1 में या _ENVमें लुआ 5.2 और 5.3
  • में जे एस , सभी कार्यों variadic हैं। में लुआ , कार्य किया जाना चाहिए स्पष्ट रूप से variadic रूप में घोषित किया
  • Foreachजेएस में वस्तु गुणों से अधिक है। Foreach में लुआ (जो कीवर्ड का उपयोग for) iterators से अधिक लूप और अधिक सामान्य है।
    • अद्यतन : जेएस में अब भी Iterables हैं, जिनमें से कई नियमित डेटा संरचनाओं में निर्मित होते हैं जिनकी आप अपेक्षा करते हैं, जैसे Array। इन्हें for...ofसिंटैक्स के साथ लूप किया जा सकता है । नियमित वस्तुओं के लिए, कोई भी अपने स्वयं के पुनरावृत्त कार्यों को लागू कर सकता है। यह इसे लुआ के बहुत करीब लाता है।
  • जेएस में वैश्विक और फ़ंक्शन गुंजाइश है। लुआ में वैश्विक और ब्लॉक गुंजाइश है । नियंत्रण संरचनाओं (जैसे if, for, while) नया परिचय ब्लॉक

    • स्कूपिंग नियमों में अंतर के कारण, एक बाहरी चर (लुआ पार्ल में "अपवैल्यूज़" कहा जाता है) के संदर्भ को लुआ और जावास्क्रिप्ट में अलग तरीके से संभाला जा सकता है । यह छोरों में बंद होने केfor साथ सबसे अधिक अनुभवी है , और कुछ लोगों को आश्चर्यचकित करता है। में जावास्क्रिप्ट , एक के शरीर forपाश, एक नया गुंजाइश परिचय नहीं है इसलिए किसी भी कार्य करता है पाश शरीर में सभी संदर्भ घोषित एक ही बाहरी चर । लुआ में, 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)

      परिणामस्वरूप, अलग-अलग पुनरावृत्तियों में परिभाषित कार्यों में प्रत्येक संदर्भित लूप चर के लिए अलग-अलग उत्थान हैं। निकोलस बोला के Lua में बंद होने के कार्यान्वयन के जवाब भी देखें और " लूप वेरिएबल पर क्लोजर के सही शब्दार्थ क्या हैं? " और " सेनिक फॉर जेनेरिक "।

      अद्यतन : जेएस अब ब्लॉक गुंजाइश है। वेरिएबल्स को ब्लॉक स्कोप के साथ letया constसम्मान से परिभाषित किया गया है ।

  • जेएस में आंतरिक शाब्दिक अष्टक में हो सकता है।
  • जेएस के पास यूनिकोड समर्थन स्पष्ट है, और आंतरिक रूप से तार यूटीएफ -16 में एन्कोडेड हैं (इसलिए वे बाइट्स के जोड़े के अनुक्रम हैं)। विभिन्न अंतर्निहित जावास्क्रिप्ट फ़ंक्शन यूनिकोड डेटा का उपयोग करते हैं, जैसे "pâté".toUpperCase()( "PÂTÉ")। Lua 5.3 और ऊपर में यूनिकोड कोड पॉइंट एस्केप सीक्वेंस हैं जो स्ट्रिंग लिटरल (जावास्क्रिप्ट कोड पॉइंट एस्केप सीक्वेंस के समान सिंटैक्स के साथ) के साथ-साथ अंतर्निहित utf8लाइब्रेरी में हैं, जो UTF-8 एन्कोडिंग के लिए मूल समर्थन प्रदान करता है(जैसे यूटीएफ -8 में कोड बिंदुओं को कूटना और कोड बिंदुओं में यूटीएफ -8 को डिकोड करना, एक स्ट्रिंग में कोड बिंदुओं की संख्या प्राप्त करना और कोड बिंदुओं पर पुनरावृत्ति करना)। लुआ में स्ट्रिंग्स व्यक्तिगत बाइट्स के अनुक्रम हैं और किसी भी एन्कोडिंग या मनमाने ढंग से द्विआधारी डेटा में पाठ शामिल कर सकते हैं। Lua में कोई अंतर्निहित कार्य नहीं है जो यूनिकोड डेटा का उपयोग करता है; के व्यवहार string.upperसी स्थान पर निर्भर करता है।
  • में लुआ , not, or, andखोजशब्दों के स्थान पर उपयोग किया जाता है जे एस के !, ||, &&
  • लूआ~= "न के बराबर" के लिए उपयोग करता है , जबकि जेएस उपयोग करता है !==। उदाहरण के लिए, if foo ~= 20 then ... end
  • Lua 5.3 और ~बाइनरी बिटवायर्न XOR के लिए उपयोग , जबकि JS उपयोग करता है ^
  • में लुआ , मूल्य (सिवाय किसी भी प्रकार के nilऔर NaN) एक मेज सूचकांक के लिए इस्तेमाल किया जा सकता है। में जावास्क्रिप्ट , सभी गैर-स्ट्रिंग प्रकार (प्रतीक को छोड़कर) सूचकांक को कोई चीज इस्तेमाल किया जा रहा से पहले तार करने के लिए बदल रहे हैं। उदाहरण के लिए, निम्नलिखित कोड के मूल्यांकन के बाद, का मूल्य जावास्क्रिप्ट में obj[1]होगा "string one", लेकिन "number one"लुआ में obj = {}; obj[1] = "number one"; obj["1"] = "string one";:।
  • में जे एस , कार्य अभिव्यक्ति के रूप में इलाज कर रहे हैं, लेकिन में लुआ वे नहीं हैं। इस प्रकार, जे एस की स्थिति में कार्य की अनुमति देता है if, whileऔर do whileबयान, लेकिन लुआ में नहीं है if, whileऔर repeat untilबयान। उदाहरण के लिए, if (x = 'a') {}जेएस मान्य है, लेकिन if x = 'a' do endअमान्य लुआ है।
  • लुआ ब्लॉक-दायरे वाले समारोह चर, कार्यों कि क्षेत्र हैं घोषित करने के लिए वाक्यात्मक चीनी है, और विधियों ( local function() end, function t.fieldname() end, function t:methodname() end)। JS इन्हें समान चिन्ह ( let funcname = function optionalFuncname() {}, objectname.fieldname = function () {}) के साथ घोषित करता है ।

6
लुआ में, तार्किक ऑपरेटर (और, या) किसी एक तर्क को वापस करते हैं। सभी कार्यों को किसी भी संख्या के मापदंडों के साथ बुलाया जा सकता है; लेकिन आवश्यक संख्या के लिए समायोजित कर रहे हैं (जब तक आप ... 'अतिरिक्त args' का उपयोग नहीं करते)
जेवियर

1
@ आरसीआईएक्स: देखें luaconf.h (और लुआ 5.2 में, lparser.c और llimits.h)। मैक्स लोकल वैल्यूज़ / फंक्शन = 200 इन लुआ 5.1 और लुआ 5.2। मैक्स upvalues ​​/ function = Lua 5.1 में 60, Lua 5.2 में 255 (और इस गणना में फ़ंक्शन के अंदर बनाए गए "क्लोजर द्वारा विरासत में मिली" "upvalues" भी शामिल हैं।
डबियसजिम 18

8
मुझे लगता है कि आप सूची में 1-आधारित सरणियों को जोड़ सकते हैं, जब आप इसका उपयोग नहीं करते हैं तो यह बहुत कष्टप्रद हो सकता है।
यान

2
लुआ में केवल नील और झूठे मिथ्या हैं - इसलिए, उदाहरण के लिए, 0 लुआ में सत्य है, लेकिन जेएस में नहीं। यूनिकोड समर्थन के बारे में: Lua 5.3 कुछ स्पष्ट UTF-8 समर्थन जोड़ता है, और पुराने Lua संस्करण तार में आयोजित UTF-8 बफ़र्स के अनुकूल हैं (जैसे आप स्ट्रिंग खोज पैटर्न में यूनिकोड का उपयोग कर सकते हैं)। UTF-8 का Js समर्थन सही नहीं है क्योंकि V8 आंतरिक रूप से एक पुराने 16-बिट प्रतिनिधित्व का उपयोग करता है, इसलिए आपके यूनिकोड के तार (आश्चर्य!) के साथ समाप्त हो सकते हैं जो अच्छे ol 'UTF-8 (8) में आवश्यक नहीं होंगे! 'लुआ में होता है)।
टायलर

4
मुझे यह सूची बहुत अच्छी लगी, लेकिन मैं यह नहीं देखता कि सूक्ष्म कीड़े कैसे ~=भड़का सकते हैं । यह वाक्यविन्यास त्रुटियों को भड़का सकता है , लेकिन वे सूक्ष्म नहीं हैं।
किकिताो

12

कुछ सूक्ष्म अंतर जो आपको कम से कम एक बार पकड़ लेंगे:

  • बराबर नहीं ~=लुआ में वर्तनी है। जेएस में यह है!=
  • लुआ सरणियां 1-आधारित हैं - उनका पहला सूचकांक 0 के बजाय 1 है।
  • लुआ को ऑब्जेक्ट विधियों को कॉल करने की अवधि के बजाय एक बृहदान्त्र की आवश्यकता होती है। आप † केa:foo() बजाय लिखते हैंa.foo()

यदि आप चाहें तो एक अवधि का उपयोग कर सकते हैं, लेकिन selfचर को स्पष्ट रूप से पास करना होगा । a.foo(a)थोड़ा बोझिल लग रहा है। देखें लुआ में प्रोग्रामिंग जानकारी के लिए।


5
एनोटेशन के लिए उपयोग करने से ऐसा लगता है जैसे a.foo()xD मर गया है
DarkWiiPlayer

11

ईमानदार होने के लिए उन चीज़ों को सूचीबद्ध करना आसान होगा जो जावास्क्रिप्ट और लूआ के बीच अंतर की सूची के लिए सामान्य हैं। वे दोनों गतिशील रूप से लिखी जाने वाली स्क्रिप्टिंग भाषा हैं, लेकिन जहाँ तक आप वास्तव में जा सकते हैं। उनके पास पूरी तरह से अलग वाक्यविन्यास, विभिन्न मूल डिजाइन लक्ष्य हैं, ऑपरेशन के विभिन्न तरीके (Lua हमेशा बायटेकोड के लिए संकलित किए जाते हैं और Lua VM, जावास्क्रिप्ट भिन्न होते हैं), सूची में और पर चला जाता है।


8
पूर्ण रूप से। बहुत अलग लक्ष्यों में स्वच्छ भाषा होने की उच्च प्राथमिकता शामिल है। जावास्क्रिप्ट में बहुत सारा ऐतिहासिक सामान है, लुआ लगातार कुछ भी निकालता है जो अवांछित है।
जेवियर

3
+1। मैं यह भी नहीं देखता कि वे कैसे समान हैं, इस तथ्य को छोड़कर कि वे दोनों स्क्रिप्टिंग के लिए उपयोग किए जाते हैं (जो बहुत स्पष्ट है)।
साशा चेदिगोव

13
-1 (अगर मैं कर सकता था) वे भाषा डिजाइन के मोर्चे पर बहुत समान हैं। लुआ में बस अधिक विशेषताएं हैं और छोटी (और भी तेज है?)। मुझे लगता है कि आप कार्यान्वयन विकल्पों के साथ भाषा डिजाइन को भ्रमित करते हैं।
जेपीसी

हाँ, वे दोनों ओओपी प्रोटोटाइप हैं (भले ही यह स्पष्ट रूप से कीवर्ड prototypeया ऑब्जेक्ट्स ऑब्जेक्ट्स का नामकरण का उपयोग करके नहीं कहा गया है , इस तथ्य के बावजूद कि यह वास्तव में लुआ टेबल हैं), पारंपरिक अर्थों (व्यावहारिकता) में कार्यात्मक नहीं होने के बावजूद प्रथम श्रेणी के नागरिक के रूप में कार्य करता है। , घोषणात्मक विकास आदि),
बोजन मार्कोविच

2
निश्चित रूप से, वाक्यात्मक अंतर हैं और यदि आप इसे सतही रूप से देखते हैं, तो आप निष्कर्ष निकाल सकते हैं कि भाषाएं अलग हैं। हालांकि बिल्कुल वैसा ही मुख्य डेटा प्रकार (वस्तु / तालिका) और वर्गों और inherritance (कुछ है कि लागू करने की उसी तरह होने में बहुत कुछ अन्य भाषाओं का हिस्सा) उन्हें आश्चर्यजनक करीब भावना में बना देता है। गैर तुच्छ जेएस कार्यक्रम के डिजाइन एक लुआ एक के रूप में बहुत अधिक होगा।
एलेक्स गियान

7

जावास्क्रिप्ट सरणियों और ऑब्जेक्ट्स आपके विचार से करीब हैं। आप उनमें से किसी एक के तत्वों को प्राप्त करने के लिए सरणी संकेतन का उपयोग कर सकते हैं, और आप सरणियों में गैर-संख्यात्मक सूचकांक जोड़ सकते हैं। व्यक्तिगत सरणी तत्व कुछ भी पकड़ सकते हैं, और सरणी विरल हो सकती है। वे लगभग समान चचेरे भाई हैं।


1
क्या एक समान चचेरे भाई हो सकते हैं?
jameshfisher

वे एक ही डेटा संरचना हैं, एकमात्र अंतर प्रकार विवरणकर्ता है ताकि आप उन्हें अलग-अलग बता सकें।
लीलिथ नदी

5
एक और अधिक सटीक कथन होगा: एरर्स उनके "लंबाई" सदस्य के विशेष व्यवहार के साथ ऑब्जेक्ट हैं।
टॉजेन

@eegg: यकीन है, कैथी और पैटी
outis

3

मेरे सर के ऊपर से चला गया

लुआ ...

  1. कोरटाइन का समर्थन करता है
  2. तालिका के लिए कुंजी के रूप में केवल स्ट्रिंग / संख्या के लिए कोई प्रतिबंध नहीं है। सब कुछ काम करता है।
  3. त्रुटि से निपटने कुछ अनाड़ी है। या तो आप कुछ भी नहीं संभालते हैं या पीसीएल विधि का उपयोग नहीं करते हैं
  4. मुझे लगता है कि मैंने लेक्सिकल स्कोप में अंतर के बारे में कुछ पढ़ा है और लुआ के पास बेहतर है।
  5. अगर मुझे सही ढंग से याद है कि लू में नियमित अभिव्यक्ति का समर्थन सीमित है

लुआ करता शाब्दिक गुंजाइश है। जावास्क्रिप्ट में केवल फंक्शन स्कोप है। खैर, मोज़िला और राइनो यो में अब 'var' की जगह 'लेट' का इस्तेमाल कर सकते हैं और उचित लेक्सिकल स्कोप प्राप्त कर सकते हैं; लेकिन यह अभी तक पोर्टेबल नहीं है।
जेवियर

1
Lua के मानक स्ट्रिंग लाइब्रेरी में सीमित पैटर्न मिलान कार्य शामिल हैं; लेकिन वहाँ भी LPEG (एक पुस्तकालय) है, जो एक अधिक शक्तिशाली मिलान प्रणाली देता है, आसानी से एक पूर्ण व्याकरण के लिए प्रयोग करने योग्य है।
जेवियर

मैंने कहा कि LUA में "बेहतर" लेक्सिकल स्कोप है तो जावास्क्रिप्ट है कि यह कोई भी नहीं है।
घबराना

1
LPEG एक अतिरिक्त पुस्तकालय जो कोर regex समर्थन का मतलब मेरे लिए सीमित है
घबराना

स्ट्रिंग कुंजियों और संख्या कुंजियों के बीच कुछ हद तक प्रतिबंध है, दोनों का उपयोग करके एक ही तालिका में बहुत तेज़ी से गड़बड़ हो जाती है, जैसा कि # रिटर्न टेबल की लंबाई, न कि अनुक्रमित अनुक्रमित की मात्रा से, जो कि किसी भी शब्दकोश प्रविष्टि (अनुक्रमण के बाद शून्य) के साथ संघर्ष करेगा टेबल इंडेक्स)
वीवे फेर्रेलाइन

3

मुझे यह सवाल और प्रदान किए गए उत्तर पसंद आए। अतिरिक्त कारणों से दो भाषाएँ मुझे एक जैसी नहीं लगतीं:

दोनों चर को कार्य सौंपते हैं, मक्खी पर कार्य का निर्माण कर सकते हैं, और बंदियों को परिभाषित कर सकते हैं।


1

लुआ और जावास्क्रिप्ट दोनों प्रोटोटाइप बेस लैंग्वेज हैं।


1
यह दो भाषाओं के बीच स्पष्ट समानता है, यह और मुख्य डेटा प्रकार के रूप में टेबल / हैश का उनका उपयोग है। यदि आप एक जावास्क्रिप्ट प्रोग्राम को मुहावरेदार तरीके से विकसित करने के लिए थे, तो आप लुआ में जितना होगा उतना ही दृष्टिकोण लेंगे। आप एक नी अन्य भाषा में ऐसा नहीं करेंगे (जब तक कि यह प्रोटोटाइप विरासत और तालिकाओं पर आधारित भाषा नहीं है)। यह बहुत बड़ी समानता है। बाकी, मामूली वाक्यविन्यास और इतने पर विवरण तुलना में बहुत पांडित्यपूर्ण हैं।
एलेक्स जियान

1
महत्वपूर्ण अंतर यह है कि जावास्क्रिप्ट कॉरटाइन का समर्थन नहीं करता है, सी के साथ बहुत कसकर युग्मित नहीं है, और वास्तव में एक एम्बेडेड भाषा के रूप में उपयुक्त नहीं है। (जावास्क्रिप्ट में कितने माइक्रोकंट्रोलर प्रोग्राम किए जाते हैं?) जावास्क्रिप्ट भी बहुत अधिक गन्दा होता है, जिसमें टाँगेस लीथेका और वॉक्स के टन होते हैं ( नष्ट होते हैं । लुआ एक बहुत संयमी अनुशासन लगाया गया है। जावास्क्रिप्ट, निश्चित रूप से, ब्राउज़र में बहुत मजबूत है।
एलेक्स गियान

1

एक परीक्षण से पता चलता है कि वर्तमान जावास्क्रिप्ट भी वस्तुओं को लौटाता है, या कम से कम तर्क अभिव्यक्ति जैसे लुआ करता है:

function nix(){
    alert(arguments[0]||"0");
} 
nix();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.