١٤ يوليو ٢٠٢٠

المقارنات

نحن نعرف الكثير من معاملات المقارنة من الرياضيات
وفي لغة الجافسكريبت تكتب كما يلي
  • أكبر/أصغر من: 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. القيم “فارغة” و “غير محددة” تساوي بعضها البعض فقط.
  5. المساواة الصارمة صارمة. أنواع مختلفة من كلا الجانبين تؤدي إلى خطأ. 6- على غرار "(4)` ، “فارغ” يساوي فقط “غير محدد”.
  6. المساواة الصارمة بمختلف أنواعها.
خريطة الدورة التعليمية

التعليقات

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