سؤال

أفهم أن استخدام "===" يقارن النوع ، لذا فإن تشغيل الكود التالي يؤدي إلى "غير متساوٍ" لأنه يقارن نوع الأرقام بنوع السلسلة.

var a = 20;
var b = "20";
    if (a === b) {
        alert("They are equal");
    } else {
        alert("They are not equal");
}

لكنني لا أفهم كيف استخدام "==" لمقارنة نتائج القيمة فقط في رسالة "فهي متساوية".

var a = 20;
var b = "20";
    if (a == b) {
        alert("They are equal");
    } else {
        alert("They are not equal");
}

كيف تساوي القيم؟ لم يتم تخزين السلسلة "20" كأحرف ASCII 50 و 48 (0110010 و 0110000 في ثنائي) و 20 مخزنة كرقم ثنائي فعلي 0010100؟

تحرير: شكرا للجميع! أعتقد أن جميع الردود رائعة وقد ساعدتني في فهم هذا بشكل أفضل.

هل كانت مفيدة؟

المحلول

ال == يقوم المشغل بمقارنة قيم المتغيرات فقط. إذا كانت الأنواع مختلفة ، يتم تشغيل التحويل. لذلك يتم تحويل الرقم 20 إلى السلسلة "20" ويتم مقارنة النتيجة.

ال === لا يقارن المشغل القيم فحسب ، ولكن أيضًا الأنواع ، لذلك لا يتم تشغيل أي فريق. في هذه الحالة "20" !== 20

نصائح أخرى

عند الحاجة إلى تحويل النوع ، يقوم JavaScript بتحويل السلسلة أو الرقم أو المعاملات المنطقية أو الكائن على النحو التالي.

  • عند مقارنة رقم وسلسلة ، يتم تحويل السلسلة إلى قيمة رقم. يحاول JavaScript تحويل السلسلة الحرفية إلى قيمة نوع الأرقام. أولاً ، يتم اشتقاق القيمة الرياضية من سلسلة حرفية رقمية. بعد ذلك ، يتم تقريب هذه القيمة إلى أقرب قيمة نوع الرقم.
  • إذا كان أحد المعاملات هو منطقي ، يتم تحويل المعامل المنطقي إلى 1 إذا كان صحيحًا و +0 إذا كان خطأ.
  • إذا تمت مقارنة كائن برقم أو سلسلة ، فإن JavaScript يحاول إرجاع القيمة الافتراضية للكائن. يحاول المشغلون تحويل الكائن إلى قيمة بدائية أو سلسلة أو قيمة رقم ، باستخدام أساليب ValueOF و TOSTRING للكائنات. إذا فشلت هذه المحاولة لتحويل الكائن ، يتم إنشاء خطأ في وقت التشغيل.

المشكلة في المقارنة == هي أن JavaScript الإصدار 1.2 لا يقوم بتحويل النوع ، في حين أن الإصدارات 1.1 و 1.3 فصاعدًا.

كانت المقارنة === متوفرة منذ الإصدار 1.3 ، وهي أفضل طريقة للتحقق من متغيرين مطابقة.

إذا كنت بحاجة إلى أن تكون الكود الخاص بك متوافقًا مع الإصدار 1.1 و 1.2 و 1.3 من كود JavaScript ، فيجب عليك التأكد من أن المتغيرات تتطابق مع ذلك كما لو كانت مقارنة === يتم تنفيذها.

يرى محرك JavaScript الرقم A ويلقي B إلى الرقم قبل التقييم.

جزء من تعريف "==" هو أنه سيتم تحويل القيم إلى نفس الأنواع قبل المقارنة ، عندما يكون ذلك ممكنًا. هذا صحيح بالنسبة للعديد من اللغات المكتوبة بشكل فضفاض.

تم تصميم JavaScript بحيث تعتبر سلسلة تحتوي على أرقام "متساوية" لهذا الرقم. السبب في ذلك هو بساطة الاستخدام لحالة إدخال المستخدمين في حقل إدخال ويقوم الموقع بالتحقق منه في JS - ليس عليك إلقاء السلسلة التي تم إدخالها إلى رقم قبل المقارنة.

إنه يبسط حالة الاستخدام الشائعة ، ولا يزال المشغل === يسمح لك بالمقارنة مع النوع الذي تم النظر فيه أيضًا.

As far as I know JavaScript does automatic data type conversion on the fly - so maybe the variables are casted to equivalent types automatically.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top