لماذا تعالج JavaScript عوامل التشغيل زائد وناقص بين السلاسل والأرقام بشكل مختلف؟



string int (5)

لا أفهم لماذا تعمل JavaScript بهذه الطريقة.

console.log("1" + 1);
console.log("1" - 1);

السطر الأول يطبع 11 ، والثاني يطبع 0. لماذا تتعامل جافا سكريبت مع الأول كسلسلة والثانية كرقم؟


Answer #1

لا يوجد مشغل مخصص لسلسلة الأحرف في JavaScript **. يقوم عامل التشغيل الإضافي + بإجراء سلسلة أو إضافة سلسلة ، وفقًا لنوع المعاملات:

"1" +  1  // "11"
 1  + "1" // "11"
 1  +  1  // 2

لا يوجد عكس للتسلسل (على ما أظن) ومشغِّل الطرح - ينفذ فقط الطرح بغض النظر عن نوع المعاملات:

"1" -  1  // 0
 1  - "1" // 0
 1  -  1  // 0
"a" -  1  // NaN

** ال . المشغل في PHP ومشغل في VB هي مشغلات سلسلة مخصصة السلسلة.


Answer #2

لأن المواصفات تشير صراحة إلى القيام بذلك. صفحة 75. لاحظ الفرق بين 11.6.1 الخطوات 5-8 و 11.6.2 الخطوات 5-7.

11.6.1 - يصف كيفية عمل مشغل الإضافات

1-4 . ...

5 . اسمحوا lprim يكون ToPrimitive (lval).

6 . اسمحوا rprim يكون ToPrimitive (rval).

7 . إذا كان النوع (lprim) هو String أو Type (rprim) فهو String ، إذاً

7a . إرجاع السلسلة التي تكون نتيجة لربط ToString (lprim) متبوعة بـ ToString (rprim)

8 . قم بإرجاع نتيجة تطبيق عملية الإضافة على ToNumber (lprim) و ToNumber (rprim)

11.6.2 - يصف كيفية عمل مشغل الطرح

1-4 . ...

5 . دع lnum يكون ToNumber (lval).

6 . دعونا rnum يكون ToNumber (rval).

7 . ارجع نتيجة تطبيق عملية الطرح على lnum و rnum

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


Answer #3

+ غامض. يمكن أن يعني "سلسل" أو "إضافة". نظرًا لأن أحد الأوتار عبارة عن سلسلة ، فإنه يُقصد به "تسلسل" ، وبالتالي فإن النتيجة هي 11 (والتي ، بالمناسبة ، كانت واحدة من نكتاتي المفضلة كطفل صغير. هذا و "1 + 1 = نافذة" ، كما معروض بشكل مرئي: │┼│ ニ ⊞ )

- ومع ذلك له معنى واحد فقط: طرح. لذلك يطرح.

هذا النوع من المشاكل غير موجود في لغات أخرى مثل PHP ، حيث تكون "سلسلات" . بدلاً من + ، بدون أي غموض. لا تزال هناك لغات أخرى مثل MySQL لا تملك حتى مشغل تسلسل ، بدلا من ذلك باستخدام CONCAT(a,b,c...) .


Answer #4

+ هو عبارة عن مشغل إضافي للمتغيرات الرقمية ، وعامل سلسلة لسلاسل.

عندما يكون هناك سلسلة بعد + ، ستختار جافاسكريبت استخدام + كعاملة تسلسلية وتحويل (كتابة) أكبر عدد ممكن من المصطلحات حول السلسلة بحيث يمكن وصلها. هذا فقط سلوك جافاسكريبت. (إذا جربت console.log(23 + 2 + "." + 1 + 5 + "02" + 02); ستحصل على النتيجة 25.15022 . تم كتابة الرقم 02 في السلسلة 2 قبل أن يتم تسلسله.

- يمكن أن يكون عامل جذب فقط ، لذلك عندما يتم منحه سلسلة ، فإنه سيؤدي ضمنيًا إلى تغيير نوع السلسلة "1" إلى رقم 1 ؛ إذا لم تفعل ذلك ، فلن تكون هناك طريقة "1" - 1 منطقية. إذا حاولت console.log(23 + 2 + 1 + 5 - "02" + 03); ستحصل على 32 - يتم تحويل السلسلة 02 إلى الرقم 2 . المصطلح بعد - يجب أن يكون قادراً على تحويله إلى رقم ؛ إذا حاولت console.log(23 - 2 - "." - 1 - 5 - 02 - "02"); ستحصل على NaN .

الأهم من ذلك ، إذا حاولت console.log(23 + 2 + "." + 1 + 5 - "02" + 03); ، فإنه سيتم إخراج 26.15 ، حيث كل شيء من قبل - تم التعامل معه كسلسلة (لأنه يحتوي على سلسلة "." ، ومن ثم المصطلح بعد - يتم التعامل معه كرقم.


Answer #5

تتم سلسلة السلاسل مع + لذلك ستعمل جافا سكريبت على تحويل أول رقم 1 إلى سلسلة وسَلسَلة "1" و "1" مما يجعل "11".

لا يمكنك إجراء عملية الطرح على السلاسل ، بحيث تقوم جافا سكريبت بتحويل الثانية "1" إلى رقم ويطرح 1 من 1 ، مما يؤدي إلى صفر.





console.log