هناك أربع طرق لكتابة مفتاح JavaScript، هل تعلم؟ سواء كنت تعرف ذلك أم لا، لا أعرف.
هناك طريقة واحدة أعرفها لكتابة بيان تبديل JavaScript. ولكن عندما يتعلق الأمر بالتعامل مع الفروع، هناك طرق عديدة لكتابتها. يمكن اعتبار طريقة كتابة فرع if كطريقة واحدة، ويمكن اعتبار طريقة كتابة فرع التبديل كطريقة ثانية، والثالثة هي استخدام وضع الإستراتيجية. إذا تم تضمين العوامل الشرطية أيضًا، فهناك أربعة بالضبط.
ولكن بطل الرواية في هذه المقالة هو التبديل. يعلم الجميع أن المفتاح يتم كتابته بشكل عام كمتغير أو تعبير وحالة ثابتة. حسنًا، على سبيل المثال، بالنسبة لدرجة مائة نقطة، تعتبر 90 وما فوق ممتازة، و80 وما فوق وأقل من 90 تعتبر جيدة، و60 وما فوق وأقل من 80 تعتبر مؤهلة، وأقل من 60 تعتبر غير مؤهلة باستخدام التبديل من المحتمل أن تتم كتابتها على النحو التالي:
function calcGrade(score) { خط ثابت = النتيجة / 10 |. التبديل (الخط) { الحالة 10: الحالة 9: إرجاع "ممتاز" ؛ الحالة 8: العودة "جيدة"؛ الحالة 7: الحالة 6: إرجاع "مؤهل" ؛ تقصير: العودة "غير مؤهل"؛ } }
في الكود، score / 10 | 0
لها نفس تأثير Math.floor(score / 10)
، وهو القسمة على 10 للحصول على الجزء الصحيح من حاصل القسمة.
يتم استخدام رمز التبديل هذا بشكل جيد، كما أن طريقة التقريب لتجنب استخدام قائمة طويلة من فروع if...else هي أيضًا خدعة ذكية.
لكن الآن تغيرت القواعد وانخفضت النقطة الفاصلة بين المؤهل والجيد من 80 نقطة إلى 75 نقطة، فماذا علينا أن نفعل؟
لا تزال طريقة التقريب المذكورة أعلاه ممكنة، لكن المقسوم عليه هذه المرة لم يعد 10، بل 5. في المقابل، هناك العديد من الحالات:
اكتب 9 حالات من الأفضل استخدامها إذا... غير ذلك.
هل هي؟ في الواقع، هناك طريقة أبسط للكتابة باستخدام التبديل:
function calcGrade(score) { التبديل (صحيح) { درجة الحالة >= 90: إرجاع "ممتاز" ؛ درجة الحالة >= 75: العودة "جيدة"؛ درجة الحالة >= 60: إرجاع "مؤهل" ؛ تقصير: العودة "غير مؤهل"؛ } }
هل يبدو الأمر غريبًا بعض الشيء؟ هذا ليس تعبير حالة التبديل المعتاد الثابت على الإطلاق، ولكنه على العكس تمامًا، تعبير حالة التبديل الثابت! إذا أخذت هذا البرنامج وقمت بتشغيله، ستجد أنه لا توجد مشكلة على الإطلاق. لأن - التبديل والحالة متطابقان وفقًا لـ ===
، فلا يهم ما إذا كان تعبيرًا أم ثابتًا، أو بمعنى آخر، يمكن أن يتبع التبديل والحالة تعبير!
نعم التعبير!
لذلك في المثال أعلاه، تغيير switch(true)
switch( 2 > 1)
له نفس التأثير.
حسنا، ذهني مفتوح. لا يهم عدد الطرق التي يمكنك من خلالها كتابة التبديل. الشيء التالي الذي يجب النظر إليه هو متغير التبديل.
: رأيت أن C# يحتوي على تعبير تبديل، وأنا أشعر بالغيرة، هل يمكن تنفيذه؟
لا تقلق، كل شيء في JavaScript يمكن أن يكون تعبيرًا... إذا لم يكن الأمر كذلك، فما عليك سوى استخدام IIFE لتغليف
دالة واحدة calcGrade(score) { العودة (القيمة => { التبديل (صحيح) { قيمة الحالة >= 90: إرجاع "ممتاز" ؛ قيمة الحالة >= 75: العودة "جيدة"؛ قيمة الحالة >= 60: إرجاع "مؤهل" ؛ تقصير: العودة "غير مؤهل"؛ } })(نتيجة)؛ }
لاحظ أنه يتم استخدام score
كمعلمة لـ IIFE هنا لأنه في الاستخدام الفعلي، قد يلزم تمرير التعبير. في هذه الحالة يجب تقييمه مسبقًا ولمرة واحدة فقط (لتجنب الآثار الجانبية للاستبدال).
ومع ذلك، من الواضح أن هذا التغليف لا معنى له إذا كنت تريد تغليفه بهذه الطريقة، فمن الأفضل تغليفه كاستراتيجية:
function calcGrade(score) {. إرجاع ((القيمة، القواعد) => Rules.find(({ t }) => t(value)).v)( نتيجة، [ { ر: ن =>= 90، الخامس: "ممتاز" }, { ر: ن =>= 75، الخامس: "جيد" }, { ر: ن =>= 60، الخامس: "مؤهل" }, { t: () => صحيح، v: "غير مؤهل" }, ] ); }
كل استراتيجية عبارة عن كائن يحتوي على أداة اختبار ( t
) وقيمة ( v
). tester هي دالة حكم تمرر القيمة التي يجب الحكم عليها، وهو التعبير هنا في switch (表达式)
، ويتم تمرير هذا التعبير أيضًا كمعلمة لـ IIFE بعد تقييمه مسبقًا. إن عملية تطبيق الإستراتيجية بسيطة وبسيطة، وتتمثل في العثور على الإستراتيجية الأولى التي تستوفي الشروط وتستخرج قيمتها.
وبطبيعة الحال، هذه الاستراتيجية مبالغ فيها بعض الشيء. عندما تحتاج حقًا إلى استخدام إستراتيجية ما، فإن الإستراتيجية عادةً لا تكون قيمة، بل سلوكًا، أي وظيفة.
نحن نعلم أنه في بيان التبديل، كل حالة في نفس النطاق، لذلك لا يمكن الإعلان عن نفس المتغير المحلي في بياني حالة. على الرغم من أن الالتفاف باستخدام { }
يمكن أن يحل هذه المشكلات، إلا أن الكود لا يبدو جيدًا جدًا، يجب الحرص بشكل خاص على عدم نسيان break
. إذا كنت تستخدم إستراتيجية، فقد تبدو ممتعة للعين، ولا داعي للقلق بشأن مشكلة الاستراحة:
هنا لأغراض العرض التوضيحي، في سلوك الإستراتيجية، سيتم إخراج النتائج أولاً، وبعد ذلك سيتم تحديد المستوى عاد.
وظيفة حساب الدرجة (النتيجة) { إرجاع ((القيمة، القواعد) => القواعد.find(({ t }) => t(value)).fn(value))( نتيجة، [ { ر: ن => ن >= 90، الجبهة الوطنية: النتيجة => { درجة ثابتة = "ممتاز"؛ console.log(grade, Score); درجة العودة } }, { ر: ن => ن >= 75، الجبهة الوطنية: النتيجة => { درجة ثابتة = "جيدة"؛ console.log(grade, Score); درجة العودة } }, { ر: ن => ن >= 60، الجبهة الوطنية: النتيجة => { درجة ثابتة = "ناجح"؛ console.log(grade, Score); درجة العودة } }, { ر: () => صحيح، الجبهة الوطنية: النتيجة => { درجة ثابتة = "غير مؤهل"؛ console.log(grade, Score); درجة العودة } }, ] ); }
الكود طويل بعض الشيء بالفعل نظرًا لوجود منطق سلوك استراتيجي فيه. إذا كان سيتم استخدامه حقًا كتعبير تبديل، فيجب أن يكون جزء الإستراتيجية عبارة عن تعبير، وليس طويلًا جدًا. في الكود أعلاه، سلوك الإستراتيجية مشابه ويمكن تغليفه في دالة، بحيث يمكن كتابته في شكل تعبير:
function calcGrade(score) { const printGrade = (الدرجة، النتيجة) => { console.log(grade, Score); درجة العودة }; إرجاع ((القيمة، القواعد) => القواعد.find(({ t }) => t(value)).fn(value))( نتيجة، [ { t: n => n >= 90، fn: Score => printGrade("ممتاز"، النتيجة) }, { t: n => n >= 75، fn: Score => printGrade("جيد"، النتيجة) }, { t: n => n >= 60، fn: Score => printGrade("مؤهل"، النتيجة) }, { t: () => صحيح، fn: النتيجة => printGrade("غير مؤهل"، النتيجة) }, ] ); }
هل تبدو جيدة المظهر الآن؟
الرموز المذكورة أعلاه لها أشكال مختلفة وتقوم بأشياء متشابهة، ولا توجد مقارنة أي منها أفضل. بغض النظر عما يعجبك، فأنت أنيق، ومهما لم يعجبك، فأنت غير مفضل. في مواقف مختلفة، ما عليك سوى اختيار النهج المناسب. يستخدم الكود أعلاه find()
للعثور على الإستراتيجية. إذا تم استخدام filter()
بدلاً من ذلك، فستكون القصة مختلفة.