Avatar ·

هل يمكن أن يكون التعبير (a == 1 && a == 2 && a == 3) صحيحًا في JavaScript؟

مرحبًا بالجميع! لقد بدأت مؤخرًا في تعلم JavaScript وصادفت مشكلة غريبة جدًا. تختبر هذه المشكلة ما إذا كان الشرط `(a == 1 && a == 2 && a == 3)` يمكن أن يكون صحيحًا (true) في أي وقت. للوهلة الأولى، يبدو هذا سخيفًا تمامًا — كيف يمكن لنفس المتغير أن يساوي ثلاثة أرقام مختلفة في نفس الوقت؟ إذا كتبت كودًا عاديًا: ```javascript let a = 1; console.log(a == 1 && a == 2 && a == 3); // false ``` بالطبع، أحصل على false. لكنني سمعت أن هناك بعض الحيل في JavaScript تتعلق بتحويل الأنواع (type coercion) يمكن أن تجعل هذا التعبير صحيحًا. أعلم أن `==` (المساواة غير الصارمة) يمكنها تحويل الأنواع، لكنني ما زلت لا أفهم كيف يكون ذلك ممكنًا. من فضلكم، اشرحوا لي: هل يمكن جعل هذا الشرط يعمل؟ إذا كان الأمر كذلك، فكيف؟ والأهم من ذلك — لماذا؟ هل هذا نوع من السحر أم ميزة في اللغة؟ سأكون ممتنًا لشرح مفصل مع أمثلة كود. <<>>

نعم، هذا ممكن! وإليك كيف يعمل

أنت على حق، للوهلة الأولى يبدو هذا مستحيلًا. لكن JavaScript لديها بعض الميزات المثيرة للاهتمام مع تحويل الأنواع (type coercion) والـ getters التي تسمح بذلك. إليك مثال:

let a = {
  value: 1,
  valueOf: function() {
    return this.value++;
  }
};
console.log(a == 1 && a == 2 && a == 3); // true

هذا يعمل لأننا قمنا بتعريف كائن (object) مع خاصية valueOf التي تُستدعى في كل مرة يتم فيها استخدام `==`. في كل مرة، تُعيد الخاصية القيمة الحالية ثم تزيدها بمقدار 1. لذا، في المرة الأولى تُعيد 1، ثم 2، ثم 3، مما يجعل التعبير بأكمله صحيحًا.