معاملات المقارنة في 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.