
عندما بدأت في تعلم JavaScript ، كان أول شيء فعلته هو إعداد قائمة من الحيل التي ساعدتني في توفير الوقت. لقد تجسست عليهم على المبرمجين الآخرين ، وعلى مواقع مختلفة وكتيبات.
في هذه المقالة ، سأعرض عليك 12 طريقة رائعة لتحسين وتسريع رمز JavaScript الخاص بك. في معظم الحالات ، فهي عالمية.
نذكرك: لجميع قراء "Habr" - خصم بقيمة 10،000 روبل عند التسجيل في أي دورة تدريبية في Skillbox باستخدام الرمز الترويجي "Habr".
توصي Skillbox بما يلي: دورة عملية "Mobile Developer PRO" .
تصفية قيمة فريدة من نوعها
صفائف
تم تقديم نوع الكائن Set في ES6 ، إلى جانب ... ، عامل الانتشار ، يمكننا استخدامه لإنشاء صفيف جديد يحتوي على قيم فريدة فقط.
const array = [1, 1, 2, 3, 5, 5, 1] const uniqueArray = [...new Set(array)]; console.log(uniqueArray);
في الحالة العادية ، هناك حاجة إلى المزيد من التعليمات البرمجية لأداء نفس العملية.
تعمل هذه الخدعة على صفائف تحتوي على أنواع بدائية: غير محددة ، خالية ، منطقية ، سلسلة ورقم. إذا كنت تعمل مع صفيف يحتوي على كائنات أو وظائف أو صفائف إضافية ، فستحتاج إلى طريقة مختلفة.
طول ذاكرة التخزين المؤقت في الدورات
CYCLES
عندما تتعلم عن الحلقات ، فإنك تتبع الإجراء القياسي:
for (let i = 0; i < array.length; i++){ console.log(i); }
ومع ذلك ، مع بناء الجملة هذا ، حلقة for re-check طول الصفيف في كل التكرار.
قد يكون ذلك مفيدًا في بعض الأحيان ، ولكن في معظم الحالات يكون من الأفضل تخزين ذاكرة التخزين المؤقت لطول المصفوفة ، مما يتطلب وصولاً واحداً إليها. يمكننا القيام بذلك عن طريق تحديد طول متغير ، حيث يتم تعيين المتغير 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);
باستخدام || سيعود القيمة الحقيقية الأولى. إذا تم تقييم كل معامل إلى خطأ ، فسيتم إرجاع آخر قيمة محسوبة.
let one = 1, two = 2, three = 3; console.log(one || two || three);
مثال 1دعنا نقول أننا نريد إرجاع الطول إلى متغير ، ولكن لا نعرف نوعه.
في هذه الحالة ، يمكنك استخدام إذا كان / else للتحقق من أن foo هو نوع مناسب ، ولكن قد تكون هذه الطريقة طويلة جدًا. لذلك ، من الأفضل أن تأخذ "دائرة كهربائية قصيرة".
return (foo || []).length;
إذا كان للمتغير foo طول مناسب ، فسيتم إرجاعه. خلاف ذلك ، نحصل على 0.
مثال 2هل واجهت مشاكل في الوصول إلى كائن متداخل؟ قد لا تعرف ما إذا كان كائنًا أو أحد خصائصه الفرعية موجودًا ، وقد يؤدي ذلك إلى حدوث مشكلات.
على سبيل المثال ، أردنا الوصول إلى خاصية البيانات في this.state ، لكن لم يتم تعريف البيانات حتى يعرض برنامجنا استعلامًا للتحديد.
اعتمادًا على المكان الذي نستخدمه فيه ، قد تؤدي المكالمة إلى this.state.data إلى منع التطبيق من بدء التشغيل. لحل المشكلة ، يمكننا التفاف هذا في تعبير شرطي:
if (this.state.data) { return this.state.data; } else { return 'Fetching Data'; }
سيكون الخيار الأكثر ملاءمة هو استخدام "أو" المشغل.
return (this.state.data || 'Fetching Data');
لا يمكننا تغيير الكود أعلاه لاستخدام &&. سيعود بيان "إحضار البيانات" && this.state.data إلى this.state.data سواء كان غير معرف أم لا.
سلسلة اختيارييمكنك اقتراح استخدام السلسلة الاختيارية عند محاولة إرجاع خاصية في عمق بنية شجرة. لذلك ، رمز علامة استفهام؟ يمكن استخدامها لاسترداد خاصية فقط إذا لم تكن فارغة.
على سبيل المثال ، يمكننا إعادة تشكيل المثال أعلاه عن طريق الحصول على this.state.data؟ .. (). بمعنى ، يتم إرجاع البيانات فقط إذا كانت القيمة غير فارغة.
أو ، إذا كان من المهم تحديد الحالة أم لا ، فبإمكاننا إرجاع this.state؟ .Data.
تحويل إلى منطقية
تحويل النوع
بالإضافة إلى الوظائف المنطقية المعتادة ، صحيحة وكاذبة ، يتعامل JavaScript أيضًا مع جميع القيم الأخرى كصدق أو كاذب.
ما لم ينص على خلاف ذلك ، فإن جميع القيم في جافا سكريبت صادقة ، باستثناء 0 ، "" ، لاغية ، غير محددة ، NaN ، وبالطبع خاطئة. هذا الأخير زائف.
يمكننا التبديل بسهولة بين الاثنين باستخدام! Operator ، والذي يحول النوع أيضًا إلى منطقي.
const isTrue = !0; const isFalse = !1; const alsoFalse = !!0; console.log(isTrue);
تحويل إلى سلسلة
تحويل النوع
يمكن إجراء تحويل سريع لعدد صحيح إلى سلسلة كما يلي.
const val = 1 + ""; console.log(val);
التحويل إلى عدد صحيح
تحويل النوع
نقوم بإجراء التحول العكسي على النحو التالي.
let int = "15"; int = +int; console.log(int);
يمكن أيضًا استخدام هذه الطريقة لتحويل نوع البيانات المنطقية المنطقية إلى قيم رقمية عادية ، كما هو موضح أدناه:
console.log(+true);
قد تكون هناك مواقف حيث سيتم تفسير + على أنها عامل تسلسل بدلاً من الإضافة. لتجنب هذا ، استخدم التلدة: ~~. هذا المشغل يعادل التعبير -n-1. على سبيل المثال ، ~ 15 هو -16.
باستخدام اثنين من التلدين في صف ينفي العملية ، لأن - (- - ن - 1) - 1 = ن + 1 - 1 = ن. بمعنى آخر ، ~ -16 هي 15.
const int = ~~"15" console.log(int);
القوى السريعة
OPERATIONS
بدءاً من ES7 ، يمكنك استخدام عامل الأس * كاختصار للدرجات. هذا أسرع بكثير من استخدام Math.pow (2 ، 3). يبدو الأمر بسيطًا ، لكن هذه اللحظة مدرجة في قائمة الاستقبالات ، حيث لم يتم ذكرها في كل مكان.
console.log(2 ** 3);
لا تخلط بينه وبين الرمز ^ ، والذي يستخدم عادة للتسوية. ولكن في JavaScript ، هذا هو المشغل XOR.
قبل ES7 ، لا يمكن تطبيق الاختصار ** إلا على الدرجات ذات القاعدة 2 باستخدام عامل التحول لليسار في اتجاه bitwise <<:
Math.pow(2, n); 2 << (n - 1); 2**n;
على سبيل المثال ، 2 << 3 = 16 مكافئ للتعبير 2 ** 4 = 16.
تعويم عدد صحيح
عمليات / أنواع التحويل
إذا كنت بحاجة إلى تحويل تعويم إلى عدد صحيح ، يمكنك استخدام Math.floor () أو Math.ceil () أو Math.round (). ولكن هناك طريقة أسرع ، لهذا نستخدم | ، أي عامل التشغيل OR.
console.log(23.9 | 0);
السلوك | يعتمد إلى حد كبير على ما إذا كنت تتعامل مع أرقام موجبة أو سلبية ، لذلك هذه الطريقة مناسبة فقط إذا كنت واثقًا مما تفعله.
ن | 0 يزيل كل شيء بعد الفاصل العشري ، اقتطاع رقم الفاصلة العائمة إلى عدد صحيح.
يمكنك الحصول على نفس تأثير التقريب باستخدام ~~. بعد التحويل القسري إلى عدد صحيح ، تظل القيمة دون تغيير.
نزيل الأرقام الزائدةيمكن استخدام عامل التشغيل OR لإزالة أي عدد من الأرقام من رقم. هذا يعني أننا لسنا بحاجة إلى تحويل الأنواع ، كما يلي:
let str = "1553"; Number(str.substring(0, str.length - 1));
بدلاً من ذلك ، نكتب ببساطة:
console.log(1553 / 10 | 0)
رابط تلقائي
CLASSES
يمكن استخدام رؤوس الأسهم ES6 في أساليب الفصل ، ويكون الربط ضمنيًا. بفضل هذا ، يمكنك أن تقول وداعا لتكرار التعبيرات مثل this.myMethod = this.myMethod.bind (this)!
import React, { Component } from React; export default class App extends Compononent { constructor(props) { super(props); this.state = {}; } myMethod = () => {
صفيف التشذيب
صفائف
إذا كنت بحاجة إلى إزالة القيم من صفيف ، فهناك طرق أسرع من لصق ().
على سبيل المثال ، إذا كنت تعرف حجم الصفيف الأصلي ، فيمكنك تجاوز خاصية الطول الخاصة به كما يلي:
let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; array.length = 4; console.log(array);
ولكن هناك طريقة أخرى ، وأسرع. إذا كانت السرعة مهمة لك ، فإليك اختيارنا:
let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; array = array.slice(0, 4); console.log(array);
إخراج قيمة (قيم) الصفيف الأخير
صفائف
تتطلب هذه التقنية استخدام طريقة الشريحة ().
let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; console.log(array.slice(-1));
تنسيق JSON رمز
JSON
ربما تكون قد استخدمت بالفعل JSON.stringify. هل تعلم أنه يساعد على تنسيق JSON الخاص بك؟
تقبل طريقة stringify () معلمتين اختياريتين: وظيفة المستبدل ، والتي يمكن استخدامها لتصفية JSON المعروضة ومساحة القيمة.
console.log(JSON.stringify({ alpha: 'A', beta: 'B' }, null, '\t'));
هذا كل شيء ، آمل أن تكون كل هذه الحيل مفيدة. وما الحيل التي تعرفها؟ اكتبها في التعليقات.
توصي Skillbox بما يلي: