كيف تجتاز مقابلة JavaScript: أهم الأسئلة
مقابلة مطور JavaScript لا تقتصر فقط على اختبار بناء الجملة، بل تتطلب فهماً عميقاً لكيفية عمل اللغة. هذا ينطبق بشكل خاص على Node.js، حيث تبرز المعالجة غير المتزامنة ومعالجة الأخطاء في المقدمة. في هذه المقالة، قمنا بتحليل أهم 10 أسئلة التي يتم طرحها غالباً في مقابلات مطوري المستوى المبتدئ والمتوسط. كل سؤال مصحوب بمثال كود وشرح.
1. ما هو الإغلاق (closure) وأين يتم استخدامه؟
الإغلاق هو دالة "تتذكر" نطاقها المعجمي حتى بعد انتهاء تنفيذ الدالة الخارجية. هذا هو أحد المفاهيم الأساسية في JavaScript.
مثال:
function createCounter() { let count = 0; return function() { count++; return count; };}
const counter = createCounter();console.log(counter()); // 1console.log(counter()); // 2أين يتم استخدامه؟ في الوحدات (modules)، ومصانع الدوال (function factories)، والتخزين المؤقت (memoization)، ومعالجات الأحداث، وعند التعامل مع الإغلاقات في الحلقات (مثلاً في setTimeout).
2. كيف يعمل Event Loop في Node.js؟
Event Loop هو الآلية التي تسمح لـ Node.js بتنفيذ عمليات غير محظورة (non-blocking) على الرغم من كونه أحادي الخيط. يتكون من عدة مراحل: timers، poll، check و close callbacks.
مثال مع المهام الصغيرة (microtasks):
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
// الإخراج: 1, 4, 3, 2لماذا هذا الترتيب؟ يتم تنفيذ المهام الصغيرة (Promise) فوراً بعد المكدس الحالي وقبل المرحلة التالية من Event Loop.
3. الفرق بين == و ===
العامل == يقارن القيم مع تحويل الأنواع (type coercion)، بينما === يقارن بدون تحويل (مساواة صارمة).
console.log(5 == '5'); // true (تحويل السلسلة النصية إلى رقم)console.log(5 === '5'); // false (أنواع مختلفة)console.log(null == undefined); // trueconsole.log(null === undefined); // falseفي المقابلات، غالباً ما يُطلب شرح لماذا [] == false يعطي true (بسبب المقارنة المجردة مع القيمة البدائية).
4. ما هو الوراثة النموذجية (prototypal inheritance)؟
في JavaScript، يمكن للكائنات أن ترث الخصائص من كائنات أخرى من خلال سلسلة النماذج الأولية (prototype chain). كل كائن لديه خاصية داخلية [[Prototype]] يمكن الوصول إليها عبر __proto__ أو Object.getPrototypeOf().
مثال:
const animal = { eats: true };const rabbit = { jumps: true };
rabbit.__proto__ = animal;
console.log(rabbit.eats); // true (موروث)console.log(rabbit.jumps); // trueالطريقة الحديثة هي استخدام Object.create() أو الكلاسات (وهي سكر نحوي فوق النماذج الأولية).
5. كيف يعمل this في JavaScript؟
قيمة this تُحدد حسب سياق استدعاء الدالة. القواعد الأساسية:
- في السياق العام (في المتصفح) —
window، في Node.js —global. - في دالة كطريقة لكائن — الكائن نفسه.
- في الدالة السهمية (arrow function) —
thisمعجمي (من الدالة الخارجية). - عند الاستدعاء عبر
call/apply/bind— السياق المُمرَّر بشكل صريح.
مثال:
const obj = { name: 'Alice', greet: function() { console.log(this.name); }};
obj.greet(); // Alice
const greet = obj.greet;greet(); // undefined (فقدان السياق)
const boundGreet = obj.greet.bind({ name: 'Bob' });boundGreet(); // Bob