JavaScript لغة ديناميكية قائمة على النماذج الأولية. لديها بعض القيم الأولية، وكل ما عداها يُعتبر كائنًا.
وبينما هي معروفة أكثر بوصفها لغة البرمجة النصية لصفحات الويب، فإن كثيرًا من البيئات غير المتصفحية تستخدمها أيضًا، مثل Node.js. تُطوَّر هذه اللغة بنشاط، ولأنها متعددة الأنماط، فهي تتيح أساليب عديدة للبرمجة. JavaScript لغة ديناميكية تدعم الأنماط الكائنية والأمرية والتعريفية (مثل البرمجة الوظيفية).
توجد عدة طرق أساسية لإسناد القيم إلى الأسماء في JavaScript، إما باستخدام المتغيرات أو الثوابت. في Exercism، تُكتب المتغيرات دائمًا بنمط camelCase، وتُكتب الثوابت بنمط SCREAMING_SNAKE_CASE. لا يوجد دليل رسمي يجب اتباعه، ولكل شركة أو مؤسسة دليل أسلوب خاص بها. لا تتردد في كتابة المتغيرات بالطريقة التي تحبها. وميزة كتابتها بالطريقة التي أُعدّت بها التمارين هي أنها ستُبرز بشكل مختلف في واجهة الويب وفي معظم بيئات التطوير المتكاملة.
يمكن تعريف المتغيرات في JavaScript باستخدام الكلمة المفتاحية const أو let أو var.
يمكن للمتغير أن يشير إلى قيم مختلفة خلال عمره عند استخدام let أو var. على سبيل المثال، يمكن تعريف myFirstVariable وإعادة تعريفه مرات عديدة باستخدام عامل الإسناد =:
let myFirstVariable = 1;
myFirstVariable = 'Some string';
myFirstVariable = new SomeComplexClass();
وعلى عكس let و var، لا يمكن إسناد قيمة إلا مرة واحدة للمتغيرات المعرّفة بـ const. ويُستخدم هذا لتعريف الثوابت في JavaScript.
const MY_FIRST_CONSTANT = 10;
// Can not be re-assigned.
MY_FIRST_CONSTANT = 20;
// => TypeError: Assignment to constant variable.
تُذكر الكلمة المفتاحية const لكلٍّ من المتغيرات والثوابت. ومن المفاهيم الأخرى التي تُذكر كثيرًا مع الثوابت (عدم) قابلية التغيير.
الكلمة المفتاحية const تجعل الارتباط غير قابل للتغيير فقط، أي أنه يمكنك إسناد قيمة إلى متغير const مرة واحدة فقط. وفي JavaScript، لا تكون إلا القيم الأولية غير قابلة للتغيير. أما القيم غير الأولية فيمكن تعديلها مع ذلك.
const MY_MUTABLE_VALUE_CONSTANT = { food: 'apple' };
// This is possible
MY_MUTABLE_VALUE_CONSTANT.food = 'pear';
MY_MUTABLE_VALUE_CONSTANT;
// => { food: "pear" }
كقاعدة عامة، في Exercism وفي كثير من المؤسسات وأدلة الأسلوب الخاصة بالمشاريع، لا تُعدّل القيم التي تبدو بالشكل const SCREAMING_SNAKE_CASE. فمن الناحية التقنية، يمكن تغيير هذه القيم، لكن يُنصح بعدم فعل ذلك من أجل الوضوح وضبط التوقعات في Exercism. وعندما يجب فرض ذلك، استخدم Object.freeze(value).
const MY_VALUE_CONSTANT = Object.freeze({ food: 'apple' });
// This silently fails
MY_VALUE_CONSTANT.food = 'pear';
MY_VALUE_CONSTANT;
// => { food: "apple" }
في الواقع العملي، من غير المرجح أن ترى Object.freeze في كل مكان في قاعدة الكود، لكن قاعدة عدم تعديل قيمة SCREAMING_SNAKE_CASE أبدًا قاعدة جيدة، وكثيرًا ما تُفرض باستخدام تحليل آلي مثل أدوات فحص الكود.
في JavaScript، تُغلَّف وحدات الوظائف داخل الدوال، وعادة ما تُجمع الدوال معًا في الملف نفسه إذا كانت تنتمي إلى بعضها. ويمكن لهذه الدوال أن تأخذ معاملات (وسائط)، وأن تُرجع قيمة باستخدام الكلمة المفتاحية return. وتُستدعى الدوال باستخدام صيغة ().
function add(num1, num2) {
return num1 + num2;
}
add(1, 3);
// => 4
💡 توجد في JavaScript طرق مختلفة عديدة لتعريف دالة. وتبدو هذه الطرق الأخرى مختلفة عن استخدام الكلمة المفتاحية
function. يحاول المسار تقديمها تدريجيًا، لكن إن كنت تعرفها بالفعل، فلا تتردد في استخدام أيٍّ منها. وفي معظم الحالات، لا يكون استخدام إحداها أفضل أو أسوأ من الأخرى.
الكلمتان المفتاحيتان export و import أداتان قويتان تحوّلان ملف JavaScript عاديًا إلى وحدة JavaScript. وإلى جانب السماح للكود بعرض مكوّنات مختارة، مثل الدوال والأصناف والمتغيرات والثوابت، فإنه يتيح أيضًا مجموعة كاملة من الميزات الأخرى، مثل:
ومن الأمثلة الملموسة طريقة عمل الاختبارات في مسار JavaScript على Exercism. فكل تمرين له ملف تنفيذ واحد على الأقل، مثل lasagna.js، وملف اختبار واحد على الأقل، مثل lasagna.spec.js. يستخدم ملف التنفيذ export لعرض API العامة، ويستخدم ملف الاختبار import للوصول إليها، وهكذا يستطيع اختبار نتائج التنفيذ.
// file.js
export const MY_VALUE = 10;
export function add(num1, num2) {
return num1 + num2;
}
// file.spec.js
import { MY_VALUE, add } from './file';
add(MY_VALUE, 5);
// => 15