كيف تعامل جافا سكريبت المشغل ++؟
-
23-08-2019 - |
سؤال
يقوم JavaScript بإجراء تحويلات آلية غير تقليدية مع الكائنات:
var o = {toString: function() {return "40"; }};
print(o + o);
print((o+1)+o);
print((o*2) + (+o));
سوف تطبع:
4040
40140
120
هذا بسبب +، إذا كانت أي من الحجج هي الكائنات / السلاسل، فستحاول تحويل جميع الوسائط إلى السلاسل ثم تسلسلها. إذا كانت جميع الحجج هي أرقام، فإنها تضيفها معا. * و Unary + تحويل الكائنات إلى الأرقام باستخدام Tostring (بالإضافة إلى النقاط، لا يظهر هنا).
ماذا يفعل جافا سكريبت للمشغل ++؟
المحلول
11.3 تعبيرات postfix.
بناء الجملة
postfixexpression:
- LefthandsideExpress.
- LefthandsideExpression [لا lineeterminator هنا] ++
- lefthandsideExpression [لا lineterminator هنا] -
11.3.1 مشغل زيادة Postfix
الانتاج postfixexpression: lefthandsideExpression [لا lineterminator هنا] ++ يتم تقييمها على النحو التالي:
- تقييم LefthandsideExpression.
- استدعاء GetValue (النتيجة (1)).
- مكالمة الحنجرة (الناتجة (2)).
- أضف القيمة 1 إلى (3)، باستخدام نفس القواعد كما هو الحال بالنسبة للمشغل + (القسم 11.6.3).
- استدعاء putvalue (النتيجة (1)، والنتيجة (4)).
- نتيجة العودة (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++;