نحن نعرف العديد من عوامل المقارنة من الرياضيات.
في جافا سكريبت يتم كتابتها على النحو التالي:
أكبر/أقل من: a > b
، a < b
.
أكبر/أصغر من أو يساوي: a >= b
, a <= b
.
يساوي: a == b
، يرجى ملاحظة أن علامة المساواة المزدوجة ==
تعني اختبار المساواة، بينما علامة واحدة a = b
تعني واجبًا.
لا يساوي: في الرياضيات الترميز هو ≠
، لكن في JavaScript يتم كتابته بالشكل a != b
.
سنتعلم في هذه المقالة المزيد عن الأنواع المختلفة من المقارنات، وكيفية إجراء JavaScript لها، بما في ذلك الخصائص المهمة.
في النهاية ستجد وصفة جيدة لتجنب المشكلات المتعلقة بـ "مراوغات JavaScript".
تُرجع جميع عوامل المقارنة قيمة منطقية:
true
- يعني "نعم" أو "صحيح" أو "الحقيقة".
false
- يعني "لا" أو "خطأ" أو "ليس الحقيقة".
على سبيل المثال:
تنبيه( 2 > 1 ); // صحيح (صحيح) تنبيه( 2 == 1 ); // خطأ (خطأ) تنبيه( 2 != 1 ); // صحيح (صحيح)
يمكن إسناد نتيجة المقارنة إلى متغير، تمامًا مثل أي قيمة:
دع النتيجة = 5 > 4؛ // تعيين نتيجة المقارنة تنبيه (النتيجة)؛ // حقيقي
لمعرفة ما إذا كانت سلسلة ما أكبر من سلسلة أخرى، تستخدم JavaScript ما يسمى بالترتيب "القاموس" أو "المعجمي".
بمعنى آخر، تتم مقارنة السلاسل حرفًا بحرف.
على سبيل المثال:
تنبيه('Z' > 'A' ); // حقيقي تنبيه ("التوهج"> "الفرح")؛ // حقيقي تنبيه ("النحلة" > "كن")؛ // حقيقي
الخوارزمية لمقارنة سلسلتين بسيطة:
قارن الحرف الأول من كلا السلسلتين.
إذا كان الحرف الأول من السلسلة الأولى أكبر (أو أقل) من السلسلة الأخرى، فإن السلسلة الأولى أكبر (أو أقل) من الثانية. لقد انتهينا.
بخلاف ذلك، إذا كانت الأحرف الأولى في كلا السلسلتين هي نفسها، فقم بمقارنة الأحرف الثانية بنفس الطريقة.
كرر حتى نهاية أي سلسلة.
إذا كان كلا الخيطين ينتهيان بنفس الطول، فإنهما متساويان. وإلا فإن السلسلة الأطول تكون أكبر.
في المثال الأول أعلاه، تؤدي المقارنة 'Z' > 'A'
إلى نتيجة في الخطوة الأولى.
تحتاج المقارنة الثانية 'Glow'
و 'Glee'
إلى مزيد من الخطوات حيث تتم مقارنة السلاسل حرفًا بحرف:
G
هو نفس G
.
l
هو نفس l
.
o
أكبر من e
. توقف هنا. السلسلة الأولى أكبر.
ليس قاموسًا حقيقيًا، ولكنه ترتيب Unicode
خوارزمية المقارنة المذكورة أعلاه تعادل تقريبًا تلك المستخدمة في القواميس أو دفاتر الهاتف، ولكنها ليست نفسها تمامًا.
على سبيل المثال، القضية مهمة. الحرف الكبير "A"
لا يساوي الحرف الصغير "a"
. أيهما أعظم؟ الحرف الصغير "a"
. لماذا؟ لأن الحرف الصغير يحتوي على فهرس أكبر في جدول الترميز الداخلي الذي تستخدمه JavaScript (Unicode). سنعود إلى التفاصيل المحددة والعواقب المترتبة على ذلك في فصل السلاسل.
عند مقارنة قيم من أنواع مختلفة، تقوم JavaScript بتحويل القيم إلى أرقام.
على سبيل المثال:
تنبيه('2' > 1); // صحيح، السلسلة "2" تصبح رقم 2 تنبيه( '01' == 1 ); // صحيح، السلسلة '01' تصبح رقمًا 1
بالنسبة للقيم المنطقية، يصبح true
1
false
يصبح 0
.
على سبيل المثال:
تنبيه (صحيح == 1)؛ // حقيقي تنبيه (خطأ == 0)؛ // حقيقي
نتيجة مضحكة
ومن الممكن في نفس الوقت:
قيمتان متساويتان.
أحدهما true
باعتباره منطقيًا والآخر false
باعتباره منطقيًا.
على سبيل المثال:
دع = 0؛ تنبيه (منطقي (أ))؛ // خطأ شنيع دع ب = "0"؛ تنبيه (منطقية (ب))؛ // حقيقي تنبيه (أ == ب)؛ // حقيقي!
من وجهة نظر جافا سكريبت، هذه النتيجة طبيعية تمامًا. يقوم التحقق من المساواة بتحويل القيم باستخدام التحويل الرقمي (وبالتالي يصبح "0"
0
)، بينما يستخدم التحويل Boolean
الصريح مجموعة أخرى من القواعد.
فحص المساواة المنتظم ==
به مشكلة. لا يمكن التمييز بين 0
و false
:
تنبيه (0 == خطأ)؛ // حقيقي
يحدث نفس الشيء مع سلسلة فارغة:
تنبيه( '' == خطأ ); // حقيقي
يحدث هذا بسبب تحويل المعاملات من أنواع مختلفة إلى أرقام بواسطة عامل المساواة ==
. تصبح السلسلة الفارغة، تمامًا مثل false
، صفرًا.
ماذا نفعل إذا أردنا التمييز بين 0
و false
؟
عامل المساواة الصارم ===
يتحقق من المساواة دون تحويل النوع.
بمعنى آخر، إذا كان a
و b
من نوعين مختلفين، فإن a === b
يُرجع false
على الفور دون محاولة تحويلهما.
دعونا نحاول ذلك:
تنبيه (0 === خطأ)؛ // خطأ، لأن الأنواع مختلفة
يوجد أيضًا عامل "عدم مساواة صارم" !==
مشابه لـ !=
.
يعد عامل المساواة الصارمة أطول قليلاً في الكتابة، ولكنه يوضح ما يحدث ويترك مساحة أقل للأخطاء.
هناك سلوك غير بديهي عند مقارنة القيم null
أو undefined
بالقيم الأخرى.
للتحقق الصارم من المساواة ===
وتختلف هذه القيم، لأن كل واحدة منها تنتمي إلى نوع مختلف.
تنبيه (فارغ === غير محدد)؛ // خطأ شنيع
لفحص غير صارم ==
هناك قاعدة خاصة. هذان الثنائيان هما "زوجان جميلان": إنهما يساويان بعضهما البعض (بمعنى ==
)، ولكن ليس أي قيمة أخرى.
تنبيه (فارغ == غير محدد)؛ // حقيقي
للرياضيات والمقارنات الأخرى < > <= >=
يتم تحويل null/undefined
إلى أرقام: null
يصبح 0
، بينما يصبح undefined
NaN
.
الآن دعونا نرى بعض الأشياء المضحكة التي تحدث عندما نطبق هذه القواعد. والأهم من ذلك، كيفية عدم الوقوع في الفخ معهم.
دعونا نقارن null
بالصفر:
تنبيه (فارغ > 0)؛ // (1) خطأ تنبيه (فارغ == 0)؛ // (2) خطأ تنبيه (فارغ > = 0 ); // (3) صحيح
رياضيا، هذا غريب. النتيجة الأخيرة تنص على أن " null
أكبر من أو يساوي الصفر"، لذلك في إحدى المقارنات أعلاه يجب أن يكون true
، لكن كلاهما خطأ.
والسبب هو أن التحقق من المساواة ==
والمقارنات > < >= <=
يعمل بشكل مختلف. تقوم المقارنات بتحويل null
إلى رقم، ومعاملتها على أنها 0
. لهذا السبب (3) null >= 0
صحيح و(1) null > 0
خطأ.
من ناحية أخرى، يتم تعريف التحقق من المساواة ==
لـ undefined
null
بحيث، بدون أي تحويلات، فإنهما يساويان بعضهما البعض ولا يساويان أي شيء آخر. لهذا السبب (2) null == 0
خطأ.
لا ينبغي مقارنة القيمة undefined
بالقيم الأخرى:
تنبيه (غير محدد > 0)؛ // خطأ (1) تنبيه (غير محدد <0)؛ // خطأ (2) تنبيه (غير محدد == 0)؛ // خطأ (3)
لماذا يكره الصفر كثيراً؟ دائما كاذبة!
لقد حصلنا على هذه النتائج بسبب:
تُرجع المقارنات (1)
و (2)
false
لأنه يتم تحويل undefined
إلى NaN
و NaN
هي قيمة رقمية خاصة تُرجع false
لجميع المقارنات.
يُرجع التحقق من المساواة (3)
false
لأن undefined
فقط تساوي null
و undefined
ولا توجد قيمة أخرى.
لماذا راجعنا هذه الأمثلة؟ هل يجب أن نتذكر هذه الخصائص طوال الوقت؟ حسنا، ليس حقا. في الواقع، ستصبح هذه الأشياء الصعبة مألوفة تدريجيًا بمرور الوقت، ولكن هناك طريقة قوية لتجنب حدوث مشكلات معها:
تعامل مع أي مقارنة مع undefined/null
باستثناء المساواة الصارمة ===
بعناية استثنائية.
لا تستخدم المقارنات >= > < <=
مع متغير قد يكون null/undefined
، إلا إذا كنت متأكدًا حقًا مما تفعله. إذا كان من الممكن أن يحتوي المتغير على هذه القيم، فتحقق منها بشكل منفصل.
تقوم عوامل المقارنة بإرجاع قيمة منطقية.
تتم مقارنة السلاسل حرفًا بحرف حسب ترتيب "القاموس".
عند مقارنة قيم من أنواع مختلفة، يتم تحويلها إلى أرقام (مع استبعاد التحقق الصارم من المساواة).
القيمتان null
undefined
متساويتان ==
ولا تساويان أي قيمة أخرى.
كن حذرًا عند استخدام مقارنات مثل >
أو <
مع المتغيرات التي قد تكون أحيانًا null/undefined
. يعد التحقق من وجود null/undefined
بشكل منفصل فكرة جيدة.
الأهمية: 5
ماذا ستكون نتيجة هذه التعبيرات؟
5 > 4 "تفاحة" > "أناناس" "2" > "12" غير محدد == فارغ غير محدد === فارغ فارغة == "n0n" فارغة === +"n0n"
5 > 4 → صحيح "تفاحة" > "أناناس" → خطأ "2" > "12" → صحيح غير محدد == فارغ → صحيح غير محدد === فارغ → خطأ null == "n0n" → خطأ فارغة === +"n0n" → خطأ
بعض الأسباب:
من الواضح أن هذا صحيح.
مقارنة القاموس، وبالتالي خاطئة. "a"
أصغر من "p"
.
مرة أخرى، مقارنة القاموس، الحرف الأول "2"
أكبر من الحرف الأول "1"
.
القيم null
undefined
تساوي بعضها البعض فقط.
المساواة الصارمة صارمة. أنواع مختلفة من كلا الجانبين تؤدي إلى خطأ.
على غرار (4)
، فإن null
تساوي undefined
فقط.
المساواة الصارمة بين الأنواع المختلفة.