سؤال

يقوم JavaScript بإجراء تحويلات آلية غير تقليدية مع الكائنات:

var o = {toString: function() {return "40"; }};
print(o + o);
print((o+1)+o);
print((o*2) + (+o));

سوف تطبع:

4040
40140
120

هذا بسبب +، إذا كانت أي من الحجج هي الكائنات / السلاسل، فستحاول تحويل جميع الوسائط إلى السلاسل ثم تسلسلها. إذا كانت جميع الحجج هي أرقام، فإنها تضيفها معا. * و Unary + تحويل الكائنات إلى الأرقام باستخدام Tostring (بالإضافة إلى النقاط، لا يظهر هنا).

ماذا يفعل جافا سكريبت للمشغل ++؟

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

المحلول

من مواصفات لغة Ecmascript.

11.3 تعبيرات postfix.

بناء الجملة

postfixexpression:

  • LefthandsideExpress.
  • LefthandsideExpression [لا lineeterminator هنا] ++
  • lefthandsideExpression [لا lineterminator هنا] -

11.3.1 مشغل زيادة Postfix

الانتاج postfixexpression: lefthandsideExpression [لا lineterminator هنا] ++ يتم تقييمها على النحو التالي:

  1. تقييم LefthandsideExpression.
  2. استدعاء GetValue (النتيجة (1)).
  3. مكالمة الحنجرة (الناتجة (2)).
  4. أضف القيمة 1 إلى (3)، باستخدام نفس القواعد كما هو الحال بالنسبة للمشغل + (القسم 11.6.3).
  5. استدعاء putvalue (النتيجة (1)، والنتيجة (4)).
  6. نتيجة العودة (3).

هذا هو رمز جافا سكريبت الزائفة من كيفية عمل postinc:

function postInc(a) {
  var x = +a; // Converts a to a number, Section 11.4.6 Unary + Operator
  a = x + 1;
  return x;
}

تحرير: as. mikesamuel. قال: إنه ليس بمحلل. تحديث لتعكس ذلك.

نصائح أخرى

يوضح التعليمات البرمجية التالية هذا جيدا:

var a = {toString: function() {return "40"; }};
nl(typeof a);
nl(typeof +a);
nl(typeof a);
nl(typeof (a++));
nl(a);
nl(typeof a);

الإخراج هو:

object
number
object
number
41
number

Unary Plus يحول الكائن إلى رقم ولا تعديله. أولا يحول أولا الكائن إلى رقم، ثم إرجاع هذا الرقم, ، ثم زيادات الرقم، تخزين القيمة في أ.

يعارض ذلك حلا آخر محتمل، حيث يقوم A ++ بإرجاع الكائن أولا، ثم قم بالتحويل إلى رقم ويزداد.

ال ++ يقوم المشغل بتحويل "Tonumber" (أساسا مجموعة من قواعد النوع ووظيفة ValueOf). أساسا لأي تعبير حل

 resolveExpression++

الخطوات التي اتخذتها محرك JS

 <temp> = toNumber(resolveExpression);
 resolveExpression = <temp> + 1;
 <result> = <temp>

للتعبيرات غير الذرية، على سبيل المثال. base.resolve++ أو base["resolve"]++, ، إلخ. base تم حلها مرة واحدة فقط وإعادة استخدامها. في أي حالة عضة، هذا غير ذي صلة، ومع ذلك، فمن المهم إذا كانت القيمة تزايد كائن مع تطبيق ValueOF يغير الكائن الأساسي.

على سبيل المثال

base = {};
base.value = {valueOf:function(){base = {}; return 5;}}
base.value++;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top