٢٥ مارس ٢٠٢١

المقارنات

نحن نعرف الكثير من معاملات المقارنة من الرياضيات
وفي لغة الجافسكريبت تكتب كما يلي
  • أكبر/أصغر من: a > b, a < b.
  • أكبر/أصغر من او يساوي: a >= b, a <= b.
  • يساوي: a == b ، يرجى ملاحظة أن علامة المساواة المزدوجة=تعني اختبار المساواة ، في حين أن كلمة واحدةa = b تعني تعيين أو مساواة .
  • لا تساوي. في الرياضيات يكون الترميز ،لكن في JavaScript تكتب هكذا a != b.

في هذه المقالة سنتعلم المزيد عن الأنواع المختلفة من المقارنات ، وكيف تجعلها JavaScript، بما في ذلك الخصائص المهمة.

في النهاية ستجد وصفة جيدة لتجنب المشاكل المتعلقة بـ “مراوغات JavaScript”.

Boolean هي النتيجة

تُرجع جميع عوامل المقارنة قيمة منطقية:

  • “صحيح” – يعني “نعم” أو “صحيح” أو “الحقيقة”.
  • “false” – تعني “لا” أو “خطأ” أو “ليست الحقيقة”.

فمثلا:

alert( 2 > 1 );  // true (correct)
alert( 2 == 1 ); // false (wrong)
alert( 2 != 1 ); // true (correct)

يمكن تعيين نتيجة مقارنة لمتغير ، تمامًا مثل أي قيمة:

let result = 5 > 4; // assign the result of the comparison
alert( result ); // true

مقارنة الكلمات

لمعرفة ما إذا كانت السلسلة أكبر من غيرها ، تستخدم جافا سكريبت ما يسمى بترتيب “القاموس” أو “المعجم”.

بمعنى آخر ، تتم مقارنة السلاسل حرفًا بحرف.

فمثلا:

alert( 'Z' > 'A' ); // true
alert( 'Glow' > 'Glee' ); // true
alert( 'Bee' > 'Be' ); // true

خوارزمية مقارنة سلسلتين بسيطة:

  1. قارن الحرف الأول من كلا السلاسل.
  2. إذا كان الحرف الأول من السلسلة الأولى أكبر (أو أقل) من السلسلة الأخرى ، فإن السلسلة الأولى أكبر (أو أقل) من السلسلة الثانية. لقد انتهينا.
  3. وبخلاف ذلك ، إذا كانت الأحرف الأولى لكلتا السلاسل متشابهة ، قارن الأحرف الثانية بنفس الطريقة.
  4. كرر حتى نهاية أي سلسلة.
  5. إذا انتهى كلا السلاسل بنفس الطول ، فإنهما متساويان. خلاف ذلك ، فإن السلسلة الأطول أكبر.

في الأمثلة أعلاه ، تصل المقارنة "Z" > "A" إلى نتيجة في الخطوة الأولى.

فى المقارنة الثانية 'Glow' و 'Glee' يحتاجون إلى مزيد من الخطوات حيث تتم مقارنة السلاسل حرفًا بحرف:

  1. “G” هو نفسه “G”. 2- "lهي نفس" l.
  2. o أكبر منe. توقف هنا. السلسلة الأولى أكبر.
ليس قاموسًا حقيقيًا ، ولكن ترتيب Unicode

خوارزمية المقارنة الواردة أعلاه تكافئ تقريبًا تلك المستخدمة في القواميس أو دفاتر الهاتف ، ولكنها ليست هي نفسها تمامًا.

على سبيل المثال ، القضية مهمة. الحرف الكبير “A” لا يساوي الأحرف الصغيرة “a”. أيهما أكبر؟ الأحرف الصغيرة “” أ “”. لماذا ا؟ لأن الحرف الصغير يحتوي على فهرس أكبر في جدول الترميز الداخلي تستخدم JavaScript (Unicode). سنعود إلى تفاصيل محددة وعواقب ذلك في الفصل <info: string>.

مقارنة الأنواع المختلفة

عند مقارنة قيم الأنواع المختلفة ، تحوّل JavaScript القيم إلى أرقام.

فمثلا:

alert( '2' > 1 ); // true, string '2' becomes a number 2
alert( '01' == 1 ); // true, string '01' becomes a number 1

بالنسبة إلى القيم المنطقية ، يصبح “true” “1” ويصبح “false” “0”.

فمثلا:

alert( true == 1 ); // true
alert( false == 0 ); // true

“” عنوان ذكي ومختصر = “نتيجة مضحكة” من الممكن أنه في نفس الوقت:

  • قيمتان متساويتان.
  • واحد منهم “صحيح” باعتباره منطقيًا والآخر “خطأ” باعتباره منطقيًا.

فمثلا:

let a = 0;
alert( Boolean(a) ); // false

let b = "0";
alert( Boolean(b) ); // true

alert(a == b); // true!

هذه النتيجة طبيعية من وجهة نظر JavaScript. يؤدي التحقق من المساواة إلى تحويل القيم باستخدام التحويل الرقمي (وبالتالي يصبح “0” يُصبح 0) ، بينما يستخدم التحويل الصريحBoolean` مجموعة أخرى من القواعد.

المساواة الصارمة

هناك مشكلة في التحقق المنتظم من المساواة = =. لا يمكن التمييز بين “0” و “false”:

alert( 0 == false ); // true

يحدث الشيء نفسه بسلسلة فارغة:

alert( '' == false ); // true

يحدث هذا لأن المعاملات من أنواع مختلفة يتم تحويلها إلى أرقام من قبل عامل المساواة ==. السلسلة الفارغة ، تمامًا مثل false ، تصبح صفرًا.

ماذا أفعل إذا أردنا التمييز بين “0” و “false”؟

** عامل المساواة الصارم = = يتحقق من المساواة بدون تحويل النوع. **

بمعنى آخر ، إذا كان “a” و “b” من أنواع مختلفة ، فإن “a === b” يُرجع على الفور “خطأ” دون محاولة تحويلها.

فلنجربها:

alert( 0 === false ); // false, because the types are different

هناك أيضًا عامل “صارم لعدم المساواة” ! == مشابه لـ '! = `.

عامل المساواة الصارم أطول قليلاً في الكتابة ، لكنه يوضح ما يحدث ويترك مساحة أقل للأخطاء.

مقارنة مع لا شيء وغير محدد

هناك سلوك غير بديهي عند مقارنة “null” أو “undefined” بقيم أخرى.

للتحقق من المساواة الصارمة = =

هذه القيم مختلفة ، لأن كل منها نوع مختلف.

alert( null === undefined ); // false
للتحقق غير الصارم = =

هناك قاعدة خاصة. هذان الزوجان “زوجان لطيفان”: إنهما يساويان بعضهما البعض (بمعنى = =) ، ولكن ليس أي قيمة أخرى.

alert( null == undefined ); // true
بالنسبة للرياضيات والمقارنات الأخرى <> <=> =

“null / undefined” يتم تحويلها إلى أرقام: “null” تصبح “0” ، بينما “undefined” تصبح “NaN”.

الآن دعونا نرى بعض الأشياء المضحكة التي تحدث عندما نطبق هذه القواعد. والأهم من ذلك ، كيف لا تقع في فخ معهم.

نتيجة غريبة: صفر مقابل 0

دعنا نقارن null بصفر:

alert( null > 0 );  // (1) false
alert( null == 0 ); // (2) false
alert( null >= 0 ); // (3) true

رياضيا ، هذا غريب. تشير النتيجة الأخيرة إلى أن “القيمة” فارغة “أكبر من الصفر أو تساويه” ، لذا في إحدى المقارنات أعلاه ، يجب أن تكون “true” ، لكن كلاهما خطأ.

والسبب هو أن التحقق من المساواة = = والمقارنات >> <> = <= يعمل بشكل مختلف. تقوم المقارنات بتحويل null إلى رقم ، وتعاملها على أنها0. لهذا السبب (3) null> = 0 صحيحة و (1)null> 0 خاطئة.

من ناحية أخرى ، يتم تحديد علامة المساواة = = لـ undefined وnull بحيث لا يساوي أحدهما الآخر دون تحويلات ولا يساوي أي شيء آخر. لهذا السبب (2) null == 0 خطأ.

غير المحدد غير المقارن

لا يجب مقارنة القيمة undefined بالقيم الأخرى:

alert( undefined > 0 ); // false (1)
alert( undefined < 0 ); // false (2)
alert( undefined == 0 ); // false (3)

لماذا يكره الصفر كثيرا؟ دائما خطأ!

نحصل على هذه النتائج للأسباب التالية:

  • المقارنات (1) و (2) إرجاع false لأنه يتم تحويلundefined إلى NaN وNaN هي قيمة رقمية خاصة تُرجع false لجميع المقارنات.
  • تحقق المساواة ((3) تُرجع false لأنundefined تساوي فقط null وundefined ولا قيمة أخرى.

تجنب المشاكل

لماذا راجعنا هذه الأمثلة؟ هل يجب أن نتذكر هذه الخصائص المميزة طوال الوقت؟ حسنًا ، ليس حقًا. في الواقع ، ستصبح هذه الأشياء الصعبة مألوفة تدريجيًا بمرور الوقت ، ولكن هناك طريقة صلبة للتهرب من المشاكل معها:

  • فقط تعامل مع أي مقارنة بـ “undefined / null” باستثناء المساواة الصارمة === مع رعاية استثنائية.
  • لا تستخدم المقارنات > => <<= مع متغير قد يكون فارغًا / غير محدد ، ما لم تكن متأكدًا حقًا مما تفعله. إذا كان المتغير يمكن أن يكون له هذه القيم ، تحقق منها بشكل منفصل.

ملخص

  • ترجع عوامل المقارنة قيمة منطقية.
  • تتم مقارنة السلاسل حرفًا بحرف في ترتيب “القاموس”.
  • عند مقارنة القيم من أنواع مختلفة ، يتم تحويلها إلى أرقام (باستثناء التحقق من المساواة الصارم).
  • القيمتان “null” و “undefined” تساوي == بعضها البعض ولا تساوي أي قيمة أخرى.
  • كن حذرًا عند استخدام مقارنات مثل > أو < مع المتغيرات التي يمكن أن تكون أحيانًا `خالية / غير محددة '. يُعد التحقق من “null / undefined” بشكل منفصل فكرة جيدة.

مهمه

ماذ ستكون نتيجة هذه التعبيرات؟

5 > 4
"apple" > "pineapple"
"2" > "12"
undefined == null
undefined === null
null == "\n0\n"
null === +"\n0\n"
5 > 4 → true
"apple" > "pineapple" → false
"2" > "12" → true
undefined == null → true
undefined === null → false
null == "\n0\n" → false
null === +"\n0\n" → false

بعض الأسباب:

  1. من الواضح ، صحيح.
  2. مقارنة القاموس ، وبالتالي خطأ. "a" أصغر من "p" ".
  3. مرة أخرى ، مقارنة القاموس ، الحرف الأول من "2" أكبر من الحرف الأول من "1".
  4. القيم "null" و "undefined" تساوي بعضها البعض فقط.
  5. المساواة الصارمة صارمة. أنواع مختلفة من كلا الجانبين تؤدي إلى خطأ.
  6. على غرار (4), "null" يساوي فقط undefined.
  7. المساواة الصارمة بمختلف أنواعها.
خريطة الدورة التعليمية

التعليقات

إقرأ هذا قبل أن تضع تعليقًا…
  • إذا كان لديك اقتراحات أو تريد تحسينًا - من فضلك من فضلك إفتح موضوعًا فى جيتهاب أو شارك بنفسك بدلًا من التعليقات.
  • إذا لم تستطع أن تفهم شيئّا فى المقال - وضّح ماهو.
  • إذا كنت تريد عرض كود استخدم عنصر <code> ، وللكثير من السطور استخدم <pre>، ولأكثر من 10 سطور استخدم (plnkr, JSBin, codepen…)