Ahmed Ebrahim11 نشر 27 ديسمبر 2024 أرسل تقرير نشر 27 ديسمبر 2024 السلام عليكم هذه المساله من leetcode لا حظت انه عند وضع الزيادة قبل اسم المتغير يعطي نتائج صحيحه علي عكس اذا قمت بالزيادة بشكل طبيعي هنا يعطي خطا ويظهر نواتج 5 5 5 اذا قمت بالاستدعاء الاتي /** * const counter = createCounter(5) * counter.increment(); // 6 * counter.reset(); // 5 * counter.decrement(); // 4 */ ما السبب var createCounter = function(init) { let present = init; return { increment:()=> present++, decrement:()=> present--, reset:()=> present = init, } }; 3 1 اقتباس
1 محمد عاطف17 نشر 27 ديسمبر 2024 أرسل تقرير نشر 27 ديسمبر 2024 وعليكم السلام ورحمة الله وبركاته. إن y++ and ++y هما مفهومان مختلفان تماما ولنشرح معا الفرق بينهما . إذا تم إستخدام المعامل قبل اسم المتغير فإن هذا ما يعرف باسم pre-increment: y = 1; x = ++y console.log(x); هنا من الإسم فإن هنا إذا كان المعامل قبل المتغير فسيتم أولا زيادة المتغير y قبل أى عملية . أى هنا سيتم زيادة ال y ب قيمة 1 لتصبح 2 و من ثم يتم وضع قيمة 2 في المتغير x وبذلك يتم طباعة 2 لأن x أصبح يساوي 2. أما إذا تم إستخدان المعامل بعد المتغير فهذا ما يعرف باسم post-increment: y = 1; x = y++ console.log(x); وهنا من إسمه إذا كان المعامل بعد المتغير فسيتم أولا تنفيذ العمليات المطلوبة ومن ثم يتم الزيادة . يعني في المثال السابق هنا العملية هي وضع قيمة y في x أى يتم وضع أولا قيمة y القديمة في x وبذلك يصبح x ب 1 ومن ثم حين إنتهاء العملية يتم زيادة y بقيمة 1 . أي هنا سيتم طباعة 1 لأن x ستكون ب 1 و y ستكون ب 2 . وكما في مثالك هنا إذا وضعت المعامل بعد present : var createCounter = function(init) { let present = init; return { increment:()=> present++, decrement:()=> present--, reset:()=> present = init, } }; فهنا سيتم إعادة قيمة present القديمة أولا ومن ثم يتم زيادة أو إنقاص present بقيمة 1 . ولهذا تحدث المشكلة لديك . أما في المثال التالي : var createCounter = function(init) { let present = init; return { increment:()=> ++present, decrement:()=> --present, reset:()=> present = init, } }; فهنا يتم أولا تطبيق المعامل أى زيادة إو إنقاص present بقيمة 1 ومن ثم إعادة القيمة الجديدة بعد الزيادة أو النقصان. 1 اقتباس
0 عبد الوهاب بومعراف نشر 28 ديسمبر 2024 أرسل تقرير نشر 28 ديسمبر 2024 عندما تستخدم present++ في دالة increment، تعيد الدالة القيمة الحالية ل present قبل زيادتها لذا تظهر النتيجة كما هي لذا استخدم ++present بدلا من present++ لكي تعيد القيمة بعد زيادتها كالتالي: var createCounter = function(init) { let present = init; return { increment: () => ++present, decrement: () => --present, reset: () => present = init, }; }; هنا increment تزيد present بمقدار 1 ثم تعيد القيمة الجديدة وdecrement تقلل present بمقدار 1 ثم تعيد القيمة الجديدة وأما reset تعيد present إلى القيمة الابتدائية init. اقتباس
0 ياسر مسكين نشر 28 ديسمبر 2024 أرسل تقرير نشر 28 ديسمبر 2024 المشكلة في الكود هي أنك تستخدم present++ (Post-Increment) داخل الدوال وهذا يؤدي إلى إرجاع القيمة الحالية ل present قبل عمل أي زيادة، مما يجعل النتائج غير صحيحة لذا استبدل present++ ب ++present (Pre-Increment) حتى تتم الزيادة أولا ثم تعاد القيمة بحيث counter.increment() يعيد القيمة الصحيحة بعد التعديل: var createCounter = function(init) { let present = init; return { increment:()=> ++present, decrement:()=> --present, reset:()=> present = init, } }; present++: يعيد القيمة قبل التعديل. ++present: يعدل القيمة ثم يعيدها. اقتباس
السؤال
Ahmed Ebrahim11
السلام عليكم هذه المساله من leetcode
لا حظت انه عند وضع الزيادة قبل اسم المتغير يعطي نتائج صحيحه علي عكس اذا قمت بالزيادة بشكل طبيعي
هنا يعطي خطا ويظهر نواتج 5 5 5 اذا قمت بالاستدعاء الاتي
/** * const counter = createCounter(5) * counter.increment(); // 6 * counter.reset(); // 5 * counter.decrement(); // 4 */
ما السبب
var createCounter = function(init) { let present = init; return { increment:()=> present++, decrement:()=> present--, reset:()=> present = init, } };
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.