كيف تجتاز مقابلة JavaScript: أهم الأسئلة والإجابات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة
```html

كيف تجتاز مقابلة 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


6. الوعود (Promises): السلاسل ومعالجة الأخطاء

```

المدونات

توصيات الكتب