معاملات المقارنة في JavaScript

من موسوعة حسوب
< JavaScript
مراجعة 15:42، 28 يناير 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

تملك JavaScript نوعين من المقارنة: نوع المقارنة الصارم (strict comparison) مثل المعامل === الذي تكون نتيجة المقارنة معه هي true إذا كانت كلا القيمتان من النوع نفسه ومحتوياتهما متطابقة؛ ونوع المقارنة الذي يحوِّل أنواع البيانات لتتوافق مع بعضها (type–converting comparison) مثل المعامل == الذي يحوِّل القيمتين إلى النوع نفسه قبل إجراء عملية المقارنة؛ أما لعمليات المقارنة النسبية (مثل ‎>=‎) فستحوَّل القيم المُقارَنة إلى قيم أوليّة ثم إلى نوع البيانات نفسه وذلك قبل إجراء عملية المقارنة.

تُقارَن السلاسل النصية بناءً على الترتيب الهجائي القياسي، باستخدام قيم يونيكود.

  • تكون سلسلتان نصيتان متساويتين (نوع المقارنة صارم strict) إذا كانتا تملكان نفس تسلسل المحارف، ونفس الطول.
  • يكون رقمان متساويين (نوع المقارنة صارم strict) إذا كان لهما نفس القيمة العديدة؛ لاحظ أنَّ NaN لا تساوي أيّ قيمة أخرى بما في ذلك NaN؛ والصفر الموجب والسالب متساويين فيما بينهما.
  • تكون قيمتان منطقيتان متساويتن إذا كان كلاهما true أو كلاهما false.
  • لا يمكن أن يكون كائنان منفصلان عن بعضهما متساويين بغض النظر عن نوع المقارنة.
  • أي تعبير مقارنة يتضمن كائنات لا يمكن أن تكون قيمته true إلا إذا كانت كلا القيمتين تشيران إلى الكائن نفسه.
  • القيمتان null و undefined مساويتان لنفسهما في حال كان نوع المقارنة صارم (أي أنَّنا استخدمنا معامل المطابقة)، وتساويان بعضهما بعضًا في حال كان نوع المقارنة غير صارم (أي استخدمنا معامل المساواة).

معاملات المساواة

المساواة (==)

يحوِّل معامل المساواة القيمتين اللتين يقارنهما إذا لم تكونا من النوع نفسه، ثم يُطبِّق نوع المساواة الصارم (strict comparison) عليهما. إذا كانت كلا القيمتين كائنًا فستقارن JavaScript بين المرجعيات الداخلية التي تشير إليها تلك القيم لتنظر إن كانت تشير إلى الكائن نفسه في الذاكرة.

البنية العامة

x == y

أمثلة

1    ==  1         // true
'1'  ==  1         // true
1    == '1'        // true
0    == false      // true
0    == null       // false

var object1 = {'value': 'key'}, object2 = {'value': 'key'}; 
object1 == object2 //false

0    == undefined  // false
null == undefined  // true

عدم المساواة (‎!=‎)

معامل عدم المساواة يُعيد القيمة true إذا كانت القيمتان غير متساويتين، ويحوِّل هذا المعامل القيمتين اللتين يقارنهما إذا لم تكونا من النوع نفسه. إذا كانت كلا القيمتين كائنًا فستقارن JavaScript بين المرجعيات الداخلية التي تشير إليها تلك القيم لتنظر إن كانت تشير إلى كائنين مختلفين في الذاكرة.

البنية العامة

x != y

أمثلة

1 !=   2     // true
1 !=  '1'    // false
1 !=  "1"    // false
1 !=  true   // false
0 !=  false  // false

المطابقة (===)

معامل المطابقة يُعيد القيمة true إذا كانت كلا القيمتين متساويةً (نوع المقارنة الصارم strict)، دون تحويل أنواع البيانات.

البنية العامة

x === y

أمثلة

3 === 3       // true
3 === '3'     // false

var object1 = {'value': 'key'}, object2 = {'value': 'key'};
object1 === object2    //false

عدم المطابقة (‎!==‎)

معامل المطابقة يُعيد القيمة true إذا لم تكن القيمتان متساويتين أو كان نوع البيانات مختلف.

البنية العامة

x !== y

أمثلة

3 !== '3' // true
4 !== 3   // true

معاملات المقارنة النسبية

كل معامل من المعاملات الآتية سيستدعي الدالة valueOf()‎ على كل قيمة من القيم التي يقارنها قبل إجراء المقارنة.

أكبر من (‎>‎)

سيُعيد هذا المعامل القيمة true إذا كانت القيمة التي على يساره أكبر من القيمة التي على يمينه.

البنية العامة

x > y

أمثلة

4 > 3 // true

أكبر من أو يساوي (‎>=‎)

سيُعيد هذا المعامل القيمة true إذا كانت القيمة التي على يساره أكبر من القيمة التي على يمينه أو تساويها.

البنية العامة

x >= y

أمثلة

4 >= 3 // true
3 >= 3 // true

أصغر من (‎<‎)

سيُعيد هذا المعامل القيمة true إذا كانت القيمة التي على يساره أقل من القيمة التي على يمينه.

البنية العامة

x < y

أمثلة

3 < 4 // true

أصغر من أو يساوي (‎<=‎)

سيُعيد هذا المعامل القيمة true إذا كانت القيمة التي على يساره أصغر من القيمة التي على يمينه أو تساويها.

البنية العامة

x <= y

أمثلة

3 <= 4 // true

استخدام معاملات المساواة

معاملَا المقارنة القياسيان (== و ‎!=‎) يستخدمان خوارزمية Abstract Equality Comparison Algorithm لمقارنة القيمتين. وإذا كانت القيمتان من نوعين مختلفين، فستحاول JavaScript تحويلهما إلى نوعٍ واحدٍ قبل إجراء عملية المقارنة، فمثلًا في التعبير ‎5 == '5'‎ ستحوّل السلسلة النصية على الطرف الأيمن إلى Number قبل إجراء عملية المقارنة.

أما معاملا المقارنة من النوع الصارم (=== و ‎!==‎) يستخدمان خوارزمية Strict Equality Comparison Algorithm لمقارنة القيمتين، والغرض منهما هو إجراء تحقق على مساواة قيمتين من النوع نفسه، وإذا كانت القيمتان من نوعين مختلفين فالنتيجة هي false دومًا؛ أي أنَّ ‎5 !== '5'‎.

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

عند تحويل نوع القيم عند المقارنة، فستحوِّل JavaScript القيم من النوع String أو Number أو Boolean أو Object كما يلي:

  • عند مقارنة رقم وسلسلة نصية، فستحوَّل السلسلة النصية إلى Number.
  • إذا كان أحد القيمتين Boolean، فسيحوّل إلى 1 إذا كان true و 0 إذا كان false.
  • إذا قارنا كائنًا مع عدد أو سلسلة نصية، فستحاول JavaScript إعادة القيمة الافتراضية للكائن، وستحاول تحويل الكائن إلى قيمة أوليّة (String أو Number) باستخدام الدالة valueOf أو toString.
  • لاحظ أنَّ الكائن سيحوّل إلى قيمة أوليّة إذا كانت القيمة الثانية أوليّة؛ أما إذا كانت كلا القيمتين كائنًا فستقارن مقارنة الكائنات، التي ستُعيد القيمة true إذا كانت كلا القيمتين تشيران إلى الكائن نفسه.

لاحظ أنَّه لو كان لدينا كائنين من النوع String لهما نفس القيمة، فستكون نتيجة المقارنة بينهما هي false لأنها يشيران إلى كائنين منفصلين عن بعض في الذاكرة:

'foo' === 'foo' // true

var a = new String('foo');
var b = new String('foo');

a == b     // false

a === b    // false

a == 'foo' // true

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي نعم نعم نعم نعم نعم

مصادر ومواصفات