معاملات المقارنة في JavaScript
تملك 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 |
---|---|---|---|---|---|
الدعم الأساسي | نعم | نعم | نعم | نعم | نعم |
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).
- معيار ECMAScript 5.1.
- معيار ECMAScript 3rd Edition. أضاف هذا المعيار المعاملين
===
و!==
. - معيار ECMAScript 1st Edition.