وأخيرًا بوست تاني من البوستات الشيقة في الـJavaScript، هنكمل كلامنا عن الـData Types ولكن المرادي هنتعرف على الـUndefined والـNaN! البوست ده مهم جدًا فـ خليك متابع معايا للنهاية، بدون رغي كتير بسم الله ويلا نبدأ
في الـJavaScript بشكل عام، عندنا حاجة إسمها Primitive، ودي بإختصار عبارة عن الداتا البدائية جدًا، زي الـString، الـNumber، الـBoolean، كلهم بيانات مجردة خلينا نقول، مش بيعبروا عن Object ليه Methods مثلًا، وفي نفس الوقت دي بيانات ثابتة مش متغيرة!
توهت مني؟ معلش ركز معايا شوية، في البوست اللي فات لما اتكلمنا عن المتغيرات، قولنا إن المتغير ممكن يشيل أي داتا وأغيرها براحتي بعدين، إزاي جاي النهاردة تقولي الـPrimitive Data عبارة عن بيانات ثابتة (Immutable)؟ الإجابة بإختصار هي إنك لازم تفرق بين الـVariable نفسه، وبين الداتا اللي بيشيلها
الـFalse على سبيل المثال طول عمرها False، ماينفعش يكون ليها قيمة تانية، هي ليها قيمة بدائية مش بتتغير، على عكس حاجة زي الـObject مثلًا، اللي تقدر تضيف عليه Methods، تعدل في بيانات موجودة في الـObject ذات نفسه! وصلك الفرق؟ الـPrimitive Data ثابتة، الـVariable نفسه هو اللي قيمته بتتغير من Primitive للتاني.
ومن ضمن الـPrimitive Data Types دي هي الـUndefined، أيوة اتكلمنا عنها بإختصار في البوست اللي فات، هي القيمة البدائية لأي متغير قبل ما تسندله قيمة في الـJavaScript، ومن بعد الـES5 وكل المتصفحات الحديثة بتمنع تحديث أو تغير قيمة الـUndefined، زي ما أتفقنا هي قيمة ثابتة بتعبر عن نفسها وبس.
ولو عايز الحق، مش ده الجزء الشيق النهاردة، اللي هيخليك تتجنن معايا هو الـNaN، ودي إختصار لكلمة Not a Number، ولكن يا مؤمن لو كتبت typeof NaN هيطلع Number عادي جدًا! وفي نفس الوقت الـNaN مش بتساوي نفسها! مستغرب صح؟ خليني أشرحلك
أولًا الـNaN بتعبر عن جميع الأرقام اللي خارج مجموعة الأعداد الحقيقية، يعني بتعبر عن نتيجة القسمة على صفر، بتعبر عن المالانهاية، بتعبر عن الأعداد التخيلية زي الجذر التربيعي لعدد سالب! أي رقم تتخيله خارج مجموعة الأعداد الحقيقية (اللي اتكلمنا عنها في أول بوست للـJS) الـNaN بتعبر عنه
طيب دلوقتي عرفنا الـNaN، ليه بقى الـtypeof NaN بيطلع number؟ لأنها بشكل فعلي رقم! ولكنه زي ما قولنا فوق هو رقم خارج نطاق الأعداد الحقيقية، الكمبيوتر بيتعامل معاه في النهاية على إنه numeric، ولكنه مش Actual Number، أعتقد المعنى وصلك؟
النقطة التانية بقى اللي غالبًا أول ما تشوفها هتقول الـJS فيها Bugs، وهي إزاي الـNaN مش بتساوي NaN! عزيزي، it’s not a bug, it’s a feature 😂
وبشكل رياضي، أه NaN مش بتساوي NaN، ليه؟ حلو السؤال ده، خليني أشرحلك
تخيل معايا المعادلتين اللي جايين دول
2 + 3 = 5
1 + 4 = 5
تقدر بسهولة تقول طالما الجانب الأيمن من المعادلتين بيطلع نفس النتيجة، يبقى أكيد الجانب الأيمن من المعادلة الأولى بيساوي برضه الجانب الأيمن من المعادلة التانية، يعني نقدر نعبر عنها بالطريقة دي
2 + 3 = 1 + 4
في حالة الـNaN، احنا اتفقنا إنها بتعبر عن أي أرقام خارج نطاق الأعداد الحقيقية، يعني الجذر التربيعي لسالب 16 هيطلعلي NaN، وبرضه الجذر التربيعي لسالب 4 برضه هيطلعلي NaN، يعني لو قولنا إن الـNaN بتساوي الـNaN، نقدر بسهولة نقول إن الجذر التربيعي لسالب 16 بيساوي الجذر التربيعي لسالب 4، يعني نقدر من خلال كام عماية رياضية صحيحة نثبت إن الـ16 بتساوي 4! وده غير صحيح
فـ منطقيًا ماينفعش NaN تبقى بتساوي نفسها، لأن ببساطة NaN كـOutput في النهاية بيطلعلي من كذا Input مختلف، تساوي الـOutput بيشترط إن الـInputs متساوية، ودي غير متحقق هنا، وصلالك؟
الإجابة بإختصار، لإن NaN بتعبر عن كل الأرقام خارج الأعداد الحقيقة مش رقم واحد، فـ طبيعي إن الـNaN مش بتساوي الـNaN، لأنهم ممكن يبقوا قيم مختلفة.
وبس كدة، البوست ده أنا كنت مستنيه من أول ما بدأت أتكلم عن الـJavaScript، لأنه بيعمل مشاكل لناس كتير، في النهاية حابب أشكرك لو وصلت لحد هنا، إنت حقيقي راجل جدع، وكالعادة، ده الموضوع ببساطة.
الجينيص
الجينيص