الفروق الدقيقة بين جافا سكريبت و لوا [مغلقة]

StackOverflow https://stackoverflow.com/questions/1022560

  •  06-07-2019
  •  | 
  •  

سؤال

أنا ببساطة أحب جافا سكريبت.انها أنيقة جدا (تخيل صوت هادئ من lovestruck بوي تنهد في الخلفية).

لذلك ، في الآونة الأخيرة لقد لعبت مع لوا عبر löve2d إطار (رائع!) و أعتقد لوا هو أيضا كبير.أنها الطريقة التي أرى أنها ، هذين اللغات جدا مماثلة.

هناك اختلافات واضحة ، مثل

  • بناء الجملة
  • المشكلة المجال
  • المكتبات
  • أنواع (قليلا)

ولكن التي هي أكثر دهاء منها ؟ هل هناك أي شيء المبرمج سكريبت سيكون أمرا مفروغا منه أن يعمل في لوا فقط مختلفة قليلا ؟ هل هناك أي المزالق التي قد لا تكون واضحة إلى خبرة المبرمج من لغة واحدة في محاولة الأخرى ؟

على سبيل المثال:في لوا ، المصفوفات و التجزئة ليست منفصلة (هناك فقط الجداول) - في جافا سكريبت ، فهي العددية المصفوفات و تجزئته الكائنات.حسنا, هذا هو واحد من الاختلافات أكثر وضوحا.

ولكن هل توجد فروق في متغير نطاق ثبات أو شيئا من هذا القبيل ؟

هل كانت مفيدة؟

المحلول

بعض الاختلافات الأخرى:

  • لوا لديه الدعم الأصلي ل كوروتين.
    • تحديث:تحتوي لغة JS الآن على الكلمة الأساسية الإنتاجية داخل المولدات، مما يمنحها دعمًا لـ coroutines.
  • لوا لا تحويل بين الأنواع لأي عوامل مقارنة.في JS فقط === و !== لا تكتب توفق.
  • لوا لديه عامل الأسي (^); شبيبة لا. شبيبة يستخدم عوامل تشغيل مختلفة، بما في ذلك العامل الشرطي الثلاثي (?: ضد and/or)، واعتبارًا من الإصدار 5.3، عوامل تشغيل البت (&, |, ، إلخ.ضد. metamethods ).
    • تحديث:لدى JS الآن عامل الأس **.
  • شبيبة لديه زيادة / إنقاص، اكتب عوامل التشغيل (typeof و instanceof)، عوامل التخصيص الإضافية وعوامل المقارنة الإضافية.
  • في شبيبة, ، ال ==, ===, != و !== المشغلين لديهم أسبقية أقل من >, >=, <, <=.في Lua، جميع عوامل المقارنة هي نفس الأسبقية.
  • لوا يدعم مكالمات الذيل.
  • لوا يدعم تعيين لقائمة المتغيرات.على الرغم من أنه ليس قياسيًا بعد جافا سكريبت, ، دعم محرك Mozilla's JS (وOpera، إلى حد ما) ميزة مماثلة منذ JS 1.7 (متوفر كجزء من Firefox 2) تحت الاسم "مهمة التدمير".يعد التدمير في JS أكثر عمومية، حيث يمكن استخدامه في سياقات أخرى غير المهمة، مثل تعريفات الوظائف والمكالمات و مُهيئات الحلقة. مهمة التدمير لقد كان إضافة مقترحة إلى ECMAScript (معيار اللغة وراء Javascript) لفترة من الوقت.
    • تحديث:أصبحت عملية التدمير (ومهمة التدمير) الآن جزءًا من مواصفات ECMAScript - والتي تم تنفيذها بالفعل في العديد من المحركات.
  • في لوا, ، أنت تستطيع مشغلي الزائد.
  • في لوا, ، يمكنك التعامل مع البيئات باستخدام getfenv و setfenv في لوا 5.1 أو _ENV في لوا 5.2 و 5.3.
  • في شبيبة, ، جميع الوظائف متغيرة.في لوا, ، يجب أن تكون الوظائف تم الإعلان عنها صراحةً على أنها متغيرة.
  • Foreach في شبيبة حلقات على خصائص الكائن. فوريتش في لوا (التي تستخدم الكلمة الأساسية for) حلقات فوق التكرارات وهي أكثر عمومية.
    • تحديث:شبيبة لديها التكرارات الآن أيضًا، تم دمج الكثير منها في هياكل البيانات العادية التي تتوقعها، مثل Array.يمكن تكرار هذه مع for...of بناء الجملة.بالنسبة للكائنات العادية، يمكن للمرء تنفيذ وظائف التكرار الخاصة به.وهذا يجعله أقرب بكثير إلى لوا.
  • JS له نطاق عالمي ووظيفي. لوا لديه النطاق العالمي والكتلة.هياكل التحكم (على سبيل المثال if, for, while) تقديم جديد كتل.

    • بسبب الاختلافات في قواعد تحديد النطاق، قد يتم التعامل مع مرجع الإغلاق لمتغير خارجي (يسمى "القيم العليا" في لغة Lua) بشكل مختلف في Lua وفي جافا سكريبت.هذا هو الأكثر شيوعًا مع الإغلاقات في for حلقات, ، ويفاجئ بعض الناس.في جافا سكريبت, ، جسد أ for لا تقدم الحلقة نطاقًا جديدًا، لذا فإن أي وظائف معلنة في نص الحلقة تشير جميعها إلى نفس المتغيرات الخارجية.في 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)
      

      ونتيجة لذلك، فإن الوظائف المحددة في تكرارات منفصلة لها قيم أعلى مختلفة لكل متغير حلقة مرجعي.انظر أيضًا إجابات نيكولاس بولا على تنفيذ عمليات الإغلاق في لوا؟ و "ما هي الدلالات الصحيحة للإغلاق على متغير الحلقة؟"، و "دلالات العموم ل".

      تحديث:لدى JS نطاق حظر الآن.المتغيرات المحددة ب let أو const احترام نطاق الكتلة.

  • عدد صحيح حرفي في شبيبة يمكن أن يكون في ثماني.
  • شبيبة لديه دعم واضح لـ Unicode، ويتم ترميز السلاسل داخليًا UTF-16 (لذلك فهي تسلسلات من أزواج البايتات).تستخدم وظائف JavaScript المضمنة المختلفة بيانات Unicode، مثل "pâté".toUpperCase() ("PÂTÉ"). لوا 5.3 وما فوق يحتوي على تسلسلات هروب لنقطة كود Unicode في سلسلة حرفية (بنفس بناء الجملة مثل تسلسلات هروب لنقطة كود JavaScript) بالإضافة إلى المدمج في utf8 المكتبة، التي توفر الدعم الأساسي لل ترميز UTF-8 (مثل تشفير نقاط التعليمات البرمجية إلى UTF-8 وفك تشفير UTF-8 إلى نقاط تعليمات برمجية، والحصول على عدد نقاط التعليمات البرمجية في السلسلة، والتكرار على نقاط التعليمات البرمجية).السلاسل في Lua هي تسلسلات من البايتات الفردية ويمكن أن تحتوي على نص في أي تشفير أو بيانات ثنائية عشوائية.ليس لدى Lua أي وظائف مضمنة تستخدم بيانات Unicode؛سلوك string.upper يعتمد على لغة C.
  • في لوا, ، ال not, or, and يتم استخدام الكلمات الرئيسية بدلاً من شبيبة!, ||, &&.
  • لوا الاستخدامات ~= ل"لا يساوي"، في حين شبيبة الاستخدامات !==.على سبيل المثال، if foo ~= 20 then ... end.
  • لوا 5.3 ويصل الاستخدام ~ لثنائي XOR ثنائي، في حين شبيبة الاستخدامات ^.
  • في لوا, ، أي نوع من القيمة (باستثناء nil و NaN) يمكن استخدامها لفهرسة الجدول.في جافا سكريبت, ، يتم تحويل جميع الأنواع غير النصية (باستثناء الرمز) إلى سلاسل قبل استخدامها لفهرسة كائن.على سبيل المثال، بعد تقييم الكود التالي، قيمة obj[1] سوف يكون "string one" في جافا سكريبت، ولكن "number one" في لوا: obj = {}; obj[1] = "number one"; obj["1"] = "string one";.
  • في شبيبة, ، يتم التعامل مع المهام كتعبيرات، ولكن في لوا هم ليسوا.وبالتالي، تسمح JS بالواجبات في ظروف 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). شبيبة يعلن هذه مع علامة يساوي (let funcname = function optionalFuncname() {}, objectname.fieldname = function () {}).

نصائح أخرى

هناك بعض الاختلافات الدقيقة التي ستلفت انتباهك مرة واحدة على الأقل:

  • غير متساو مكتوب ~= في لوا.في JS هو عليه !=
  • لوا المصفوفات مبنية على 1 - فهرسهم الأول هو 1 بدلاً من 0.
  • يتطلب Lua نقطتين بدلاً من نقطة لاستدعاء أساليب الكائن.انت تكتب a:foo() بدلاً من a.foo()

يمكنك استخدام فترة إذا كنت تريد، ولكن يجب أن تمر self المتغير صراحة. a.foo(a) تبدو مرهقة بعض الشيء.يرى البرمجة في لوا للتفاصيل.

لنكون صادقين، سيكون من الأسهل سرد الأشياء المشتركة بين Javascript وLua بدلاً من سرد الاختلافات.كلاهما لغات برمجة نصية مكتوبة ديناميكيًا، ولكن هذا هو أقصى ما يمكنك الذهاب إليه حقًا.لديهم بناء جملة مختلف تمامًا، وأهداف تصميم أصلية مختلفة، وأنماط تشغيل مختلفة (يتم تجميع Lua دائمًا إلى كود ثانوي وتشغيله على Lua VM، ويختلف Javascript)، والقائمة تطول وتطول.

مصفوفات وكائنات JavaScript أقرب مما تعتقد.يمكنك استخدام تدوين المصفوفة للوصول إلى عناصر أي منهما، ويمكنك إضافة مؤشرات غير رقمية إلى المصفوفات.يمكن لعناصر المصفوفة الفردية أن تحتوي على أي شيء، ويمكن أن تكون المصفوفة متفرقة.إنهم أبناء عمومة متطابقون تقريبًا.

من أعلى رأسي

لوا ...

  1. يدعم كوروتين
  2. لا يوجد لديه أي قيود على سلسلة/رقم فقط كمفتاح للجدول.كل شيء يعمل.
  3. معالجة الأخطاء خرقاء إلى حد ما.إما أنك لا تتعامل مع أي شيء أو تستخدم com.pccall طريقة
  4. أعتقد أنني قرأت شيئًا عن الاختلافات في النطاق المعجمي وأن لوا لديها الأفضل.
  5. إذا كنت أتذكر بشكل صحيح، فإن دعم التعبير العادي في Lua محدود

أنا أحب هذا السؤال والإجابات المقدمة.أسباب إضافية اللغتين يبدو على حد سواء أكثر مما ليس لي:

سواء تعيين المهام إلى المتغيرات ، يمكن بناء وظائف على الطاير ، وتحديد الإغلاق.

يكشف الاختبار أن جافا سكريبت الحالي يُرجع أيضًا كائنات، أو على الأقل سلاسل من التعبيرات المنطقية كما يفعل lua:

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

Lua وJavaScript كلاهما لغتان أساسيتان للنموذج الأولي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top