يوجد مثل هذا السؤال في مجموعة أسئلة الاختبار التي تم تجميعها بواسطة cssrain:
<لغة البرنامج النصي = "جافا سكريبت">
فار أ = 0;
فار ب = -1;
فار ج = 1؛
تأكيد الدالة (أفار) {
if (aVar==true) تنبيه(true);
تنبيه آخر (خطأ)؛
}
تأكيد (أ)؛
تأكيد (ب)؛
تأكيد (ج)؛
</النص>
تشغيل مربع التعليمات البرمجية
[Ctrl+A تحديد كافة النصائح: يمكنك تعديل جزء من الكود أولاً ثم الضغط على تشغيل]
وفقا لفهمي، أي قيمة منطقية ليست 0 يجب أن تكون صحيحة.
لكن الناتج الصحيح لهذا السؤال هو: خطأ خطأ صحيح.
قيمة (-1==صحيح) خاطئة.
لننظر إلى المثال التالي:
<لغة البرنامج النصي = "جافا سكريبت">
فار أ = 0;
فار ب = -1;
فار ج = 1؛
تأكيد الدالة (أفار) {
إذا (أفار) تنبيه (صحيح)؛
تنبيه آخر (خطأ)؛
}
تأكيد (أ)؛
تأكيد (ب)؛
تأكيد (ج)؛
</النص>
تشغيل مربع التعليمات البرمجية
[Ctrl+A تحديد كافة النصائح: يمكنك تعديل جزء من الكود أولاً ثم الضغط على تشغيل]
نتائج التشغيل هي: خطأ، صحيح، صحيح.
وهنا نجد أن نتائج if(aVar) وif(aVar == true) ليست هي نفسها.
شرح cssrain في الجواب هو:
if(aVar) وif (aVar==true) لهما إجابات مختلفة جدًا للأرقام السالبة.
هل هو حقا سبب الرقم السلبي؟ خذ بعين الاعتبار المثال التالي:
تشغيل مربع التعليمات البرمجية
[Ctrl+A تحديد كافة النصائح: يمكنك تعديل جزء من الكود أولاً ثم الضغط على تشغيل]
لماذا يُرجع الرقم الموجب 2 أيضًا خطأ؟ دعونا نحول الرقم إلى قيمة منطقية ونلقي نظرة.
تشغيل مربع التعليمات البرمجية
[Ctrl+A تحديد كافة النصائح: يمكنك تعديل جزء من الكود أولاً ثم الضغط على تشغيل]
القيم المنطقية غير الصفرية هنا صحيحة بالفعل، مما يعني أن جميع المشكلات تركز على عامل التشغيل == في 2==true. من المؤكد بشكل أساسي أن == لا يجب تحويل الأرقام إلى قيم منطقية ثم مقارنتها.
انظر إلى ما يقوله ECMA-262 (صفحة 80):
6.إذا كان النوع (x) منطقيًا، فقم بإرجاع نتيجة المقارنة ToNumber(x) == y.
7.إذا كان النوع (y) منطقيًا، فقم بإرجاع نتيجة المقارنة x == ToNumber(y).
أي أنه يتم تحويل القيم المنطقية أولاً إلى أرقام ثم مقارنتها. القيمة الرقمية للصحيح هي 1 والخطأ هي 0. لذلك لا 2 ولا -1 يمكن أن يكونا مساويين للصحيح.
ألق نظرة فاحصة على المثال التالي:
<لغة البرنامج النصي = "جافا سكريبت">
var a = "غير محدد";
فار ب = "خطأ";
فار ج = "";
تأكيد الدالة (أفار) {
if (aVar==true) تنبيه(true);
تنبيه آخر (خطأ)؛
}
تأكيد (أ)؛
تأكيد (ب)؛
تأكيد (ج)؛
</النص>
تشغيل مربع التعليمات البرمجية
[Ctrl+A تحديد كافة النصائح: يمكنك تعديل جزء من الكود أولاً ثم الضغط على تشغيل]
وفقًا للفكرة السابقة، سيتم تحويل true إلى 1، وبالتالي فإن العبارات الثلاثة ستعيد خطأ. قم بتشغيله واكتشف أن هذا هو الحال بالفعل.
بعد ذلك، قم بتغيير if(aVar==true) إلى if(aVar).
تشغيل مربع التعليمات البرمجية
[Ctrl+A تحديد كافة النصائح: يمكنك تعديل جزء من الكود أولاً ثم الضغط على تشغيل]
نتائج التشغيل في هذا الوقت صحيحة، صحيحة، خاطئة. لأن نتائج Boolean("undef") وBoolean("false") وBoolean("") صحيحة وصحيحة وكاذبة. يتم تحويل السلاسل غير الفارغة إلى صحيح منطقي.
وأخيرًا، هناك مثال لشرح قواعد المقارنة عندما يكون طرفا == عبارة عن سلاسل وأرقام.
تشغيل مربع التعليمات البرمجية
[Ctrl+A تحديد كافة النصائح: يمكنك تعديل جزء من الكود أولاً ثم الضغط على تشغيل]
هل وجدت أن هذا "001"==صحيح صحيح.
لأن true يتم تحويله إلى 1 أولاً. ثم ارجع إلى قواعد ECMA:
4.إذا كان النوع (x) عبارة عن رقم والنوع (y) عبارة عن سلسلة، فقم بإرجاع نتيجة المقارنة x == ToNumber(y).
5.إذا كان النوع (x) عبارة عن سلسلة والنوع (y) هو رقم، فقم بإرجاع نتيجة المقارنة ToNumber(x) == y.
يجب تحويل السلسلة إلى رقم، وقيمة Number("001") هي أيضًا 1، وبالتالي تكون النتيجة صحيحة.