12 حيلة جافا سكريبت لا تغطيها معظم البرامج التعليمية
عندما بدأت تعلم جافا سكريبت، أول شيء فعلته هو إعداد قائمة من الحيل التي ساعدتني في توفير الوقت. لقد رصدتها من مبرمجين آخرين، على مواقع مختلفة وفي الأدلة.
في هذه المقالة، سأعرض لك 12 طريقة رائعة لتحسين وتسريع كود JavaScript الخاص بك. في معظم الحالات تكون عالمية.
نذكر:لجميع قراء "Habr" - خصم 10 روبل عند التسجيل في أي دورة Skillbox باستخدام رمز "Habr" الترويجي.
في الحالة العادية، هناك حاجة إلى المزيد من التعليمات البرمجية لتنفيذ نفس العملية.
تعمل هذه التقنية مع المصفوفات التي تحتوي على أنواع بدائية: غير محددة، فارغة، منطقية، سلسلة ورقمية. إذا كنت تعمل مع مصفوفة تحتوي على كائنات أو وظائف أو مصفوفات إضافية، فستحتاج إلى أسلوب مختلف.
طول مجموعة ذاكرة التخزين المؤقت في الدورات
دورات
عندما تتعلم عن الحلقات، فإنك تتبع الإجراء القياسي:
for (let i = 0; i < array.length; i++){
console.log(i);
}
ومع ذلك، باستخدام بناء الجملة هذا، تتحقق حلقة for بشكل متكرر من طول المصفوفة في كل تكرار.
قد يكون هذا مفيدًا في بعض الأحيان، ولكن في معظم الحالات يكون التخزين المؤقت لطول المصفوفة أكثر كفاءة، الأمر الذي سيتطلب وصولاً واحدًا إليه. يمكننا القيام بذلك عن طريق تعريف متغير الطول حيث نحدد المتغير i، مثل هذا:
for (let i = 0, length = array.length; i < length; i++){
console.log(i);
}
من حيث المبدأ، هو تقريبًا نفس ما ورد أعلاه، ولكن بزيادة حجم الحلقة سنحصل على توفير كبير في الوقت.
تصنيف الدائرة القصيرة (تصنيف مكارثي)
العوامل المشروطة
يعد العامل الثلاثي طريقة سريعة وفعالة لكتابة عبارات شرطية بسيطة (وأحيانًا ليست بهذه البساطة):
س> 100؟ "أكثر من 100": "أقل من 100"؛
س> 100؟ (x>200? "أكثر من 200": "بين 100-200"): "أقل من 100";
لكن في بعض الأحيان يكون العامل الثلاثي أكثر تعقيدًا مما هو مطلوب. يمكننا استخدام "و" && و"أو" بدلاً من || العوامل المنطقية لتقييم تعبيرات معينة بطريقة أكثر إيجازًا. غالبًا ما يطلق عليها "الدائرة القصيرة" أو "تصنيف الدائرة القصيرة".
كيف يعمل هذا؟
لنفترض أننا نريد إرجاع شرط واحد فقط من شرطين أو أكثر.
سيؤدي استخدام && إلى إرجاع القيمة الخاطئة الأولى. إذا تم تقييم كل معامل على أنه صحيح، فسيتم إرجاع التعبير الأخير الذي تم تقييمه.
let one = 1, two = 2, three = 3;
console.log(one && two && three); // Result: 3
console.log(0 && null); // Result: 0
باستخدام || سيعود القيمة الحقيقية الأولى. إذا تم تقييم كل معامل إلى خطأ، فسيتم إرجاع آخر قيمة تم تقييمها.
let one = 1, two = 2, three = 3;
console.log(one || two || three); // Result: 1
console.log(0 || null); // Result: null
مثال 1
لنفترض أننا نريد إرجاع طول المتغير، لكننا لا نعرف نوعه.
في هذه الحالة، يمكنك استخدام if/else للتحقق من أن foo هو النوع الصحيح، ولكن قد تكون هذه الطريقة طويلة جدًا. لذلك، من الأفضل أن نأخذ "الدائرة القصيرة" الخاصة بنا.
return (foo || []).length;
إذا كان للمتغير foo طول مناسب، فسيتم إرجاعه. وإلا فإننا سوف نحصل على 0.
مثال 2
هل واجهت مشاكل في الوصول إلى كائن متداخل؟ قد لا تعرف ما إذا كان الكائن أو إحدى خصائصه الفرعية موجودة أم لا، وقد يؤدي ذلك إلى حدوث مشكلات.
على سبيل المثال، أردنا الوصول إلى خاصية البيانات في this.state، ولكن لم يتم تعريف البيانات حتى يقوم برنامجنا بإرجاع طلب جلب.
اعتمادًا على المكان الذي نستخدمه فيه، قد يؤدي استدعاء this.state.data إلى منع التطبيق من البدء. لحل المشكلة، يمكننا تغليف ذلك بتعبير شرطي:
لا يمكننا تغيير الكود أعلاه لاستخدام &&. سيعيد عامل التشغيل "جلب البيانات" && this.state.data هذه البيانات بغض النظر عما إذا كانت غير محددة أم لا.
سلسلة اختيارية
قد يقترح المرء استخدام التسلسل الاختياري عند محاولة إرجاع خاصية إلى عمق بنية الشجرة. إذن رمز علامة الاستفهام؟ يمكن استخدامها لاسترداد خاصية فقط إذا لم تكن فارغة.
على سبيل المثال، يمكننا إعادة بناء المثال أعلاه للحصول على this.state.data?..(). أي أنه يتم إرجاع البيانات فقط إذا لم تكن القيمة فارغة.
أو، إذا كان الأمر مهمًا سواء تم تعريف الحالة أم لا، فيمكننا إرجاع this.state?.data.
تحويل إلى منطقية
نوع التحويل
بالإضافة إلى الدوال المنطقية العادية صح وخطأ، تتعامل جافا سكريبت أيضًا مع جميع القيم الأخرى على أنها صادقة أو خاطئة.
إلى أن يُذكر خلاف ذلك، تكون جميع القيم في JavaScript صحيحة، باستثناء 0، ""، null، غير محدد، NaN، وبطبيعة الحال، false. هذه الأخيرة كاذبة.
يمكننا التبديل بسهولة بين الاثنين باستخدام عامل التشغيل !، والذي يحول أيضًا النوع إلى منطقي.
قد تكون هناك مواقف يتم فيها تفسير + على أنها عامل تسلسل بدلاً من عامل إضافة. لتجنب ذلك، يجب عليك استخدام التلدة: ~~. هذا العامل يعادل -n-1. على سبيل المثال، ~15 يساوي -16.
استخدام مدتين على التوالي يلغي العملية لأن - (- - n - 1) - 1 = n + 1 - 1 = n. بمعنى آخر، ~-16 يساوي 15.
بدءًا من ES7، يمكنك استخدام عامل الأس ** كاختصار للقوى. وهذا أسرع بكثير من استخدام Math.pow(2, 3). يبدو الأمر بسيطا، ولكن هذه النقطة مدرجة في قائمة التقنيات، حيث لم يتم ذكرها في كل مكان.
console.log(2 ** 3); // Result: 8
لا ينبغي الخلط بينه وبين الرمز ^، الذي يُستخدم عادة في الأس. ولكن في جافا سكريبت هذا هو عامل التشغيل XOR.
قبل ES7، كان من الممكن استخدام الاختصار ** فقط لقوى القاعدة 2 باستخدام عامل التحول الأيسر للبت <<:
Math.pow(2, n);
2 << (n - 1);
2**n;
على سبيل المثال، 2 << 3 = 16 يعادل 2 ** 4 = 16.
تعويم إلى عدد صحيح
العمليات / تحويل النوع
إذا كنت بحاجة إلى تحويل عدد عشري إلى عدد صحيح، فيمكنك استخدام Math.floor() أو Math.ceil() أو Math.round(). ولكن هناك طريقة أسرع، ولهذا نستخدم |، أي عامل التشغيل OR.
يمكن استخدام تدوينات أسهم ES6 في أساليب الفصل، ويكون الربط ضمنيًا. هذا يعني أنه يمكنك أن تقول وداعًا للتعبيرات المتكررة مثل this.myMethod = this.myMethod.bind(this)!