سؤال

أنا يبدو غير قادر على فهم الجزء الأول من هذا الرمز ( += ) في تركيبة مع مشغل الثلاثي.

h.className += h.className ? ' error' : 'error'

الطريقة أعتقد أن هذا القانون يعمل على النحو التالي:

h.className = h.className + h.className ? ' error' : 'error'

ولكن هذا ليس صحيحا لأن هذا يعطي خطأ في وحدة التحكم.

لذا سؤالي هو كيف يجب أن interpet هذا الرمز بشكل صحيح ؟

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

المحلول

h.className = h.className + (h.className ? ' error' : 'error')

تريد أن يعمل المشغل من أجله h.className, ، من الأفضل أن تكون محددًا حول هذا الموضوع.
بالطبع ، لا ينبغي أن يأتي أي ضرر h.className += ' error', ، لكن هذا مسألة أخرى.

أيضا ، لاحظ ذلك + له الأسبقية على المشغل الثلاثية: أسبقية مشغل JavaScript

نصائح أخرى

التفكير في الأمر بهذه الطريقة:

<variable> = <expression> ? <true clause> : <false clause>

طريقة بيان يعدم هو في الأساس على النحو التالي:

  1. لا <expression> تقييم صحيح ، أو أنها لا تقيم كاذبة ؟
  2. إذا <expression> يتم تقييمها إلى true ، ثم قيمة <true clause> يتم تعيين <variable>, <false clause> هو تجاهل البيان التالي يتم تنفيذها.
  3. إذا <expression> يقيم إلى false ، ثم <true clause> هو تجاهل قيمة <false clause> يتم تعيين <variable>.

المهم أن ندرك مع مشغل الثلاثي في اللغات الأخرى هو أن كل ما هو رمز في <expression> يجب أن تنتج نتيجة منطقية عند تقييم:إما true أو false.

في حالة الخاص بك على سبيل المثال استبدال "تعيينه" في شرحي مع "إضافة" ، أو ما شابه ذلك عن أيهما الاختزال الحساب الذي تستخدمه ، إذا أي.

ال += هل ما تريد ، ولكن في البيان الثلاثية في اليد اليمنى منه ، يتحقق إذا h.className كاذب ، والذي سيكون لو كان غير محدد. إذا كانت الحقيقة (أي إذا تم تحديد اسم الفصل بالفعل) ، فسيتم إضافة خطأ بمساحة (أي إضافة أ الجديد الفصل) ، وإلا يتم إضافته بدون المساحة.

يمكن إعادة كتابة الرمز كما تقترح ، ولكن عليك تحديد ذلك h.className يجب استخدامه في حدة الصعوبة ، بدلاً من استخدام قيمته الفعلية ، في المشغل الثلاثي ، لذلك تأكد من أنك لا تهتم بتسلسل القيم في نفس الوقت الذي تقوم فيه بعملك الثلاثية:

h.className = h.className + (h.className ? ' error' : 'error');

الجانب الأيمن من = يتم تقييم المشغل من اليسار إلى اليمين. لذا،

g.className = h.className + h.className ? ' error' : 'error';`

يعادل

h.className = (h.className + h.className) ? ' error' : 'error';

أن تكون مكافئة ل

h.className += h.className ? ' error' : 'error';

يجب عليك فصل البيان الثلاثية بين قوسين

h.className = h.className + (h.className ? ' error' : 'error');
if (h.className) {
    h.className = h.className + ' error';
} else {
    h.className = h.className + 'error';
}

يجب أن تكون مكافئة:

h.className += h.className ? ' error' : 'error';

أعلم أن هذا سؤال قديم للغاية ، لكنني لست سعيدًا بنسبة 100 ٪ بأي من الإجابات لأنها تبدو غير مكتملة. لذلك هنا نذهب مرة أخرى من المديرين الأوائل:

الهدف العام للمستخدم:

تلخيص الرمز: "أود أن أضيف error اسم الفصل إلى سلسلة ، اختياريا مع مساحة رائدة إذا كانت هناك بالفعل أسماء فصول في السلسلة. "

أبسط حل

كما أشار كوبي ، قبل 5 سنوات ، فإن وجود مساحة رائدة في أسماء الفصل لن يتسبب في أي مشاكل مع أي متصفحات معروفة ، وبالتالي فإن الحل الصحيح الأقصر سيكون في الواقع:

h.className += ' error';

كان ينبغي أن يكون الجواب الفعلي إلى المشكلة الفعلية.


سواء كان ذلك ، كانت الأسئلة التي تم طرحها ...

1) لماذا هذا العمل؟

h.className += h.className ? ' error' : 'error'

يعمل المشغل الشرطي/الثلاثية مثل بيان if ، والذي يعين نتيجة true أو false مسارات إلى متغير.

لذلك عمل هذا الرمز لأنه يتم تقييمه ببساطة على النحو التالي:

if (h.className IS NOT null AND IS NOT undefined AND IS NOT '') 
    h.className += ' error'
else
    h.className += 'error'

2) ولماذا هذا الانهيار؟

h.className = h.className + h.className ? ' error' : 'error'

ينص السؤال على "أن يعطي خطأ [N] في وحدة التحكم الخاصة بي" ، والذي قد يضللك في التفكير في الكود لا يعمل. في الواقع ، يتم تشغيل الرمز التالي بدون خطأ, ، لكنه ببساطة يعيد "خطأ" إذا كانت السلسلة لم يكن فارغة و "خطأ" إذا كانت السلسلة كان فارغة وهكذا لم يستوف المتطلبات.

يؤدي هذا الرمز دائمًا إلى سلسلة تحتوي فقط ' error' أو 'error' لأنه يقييم هذا الرمز الزائف:

if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
    h.className = ' error'
else
    h.className = 'error'

والسبب في ذلك هو أن مشغل الإضافة (+ إلى القوم المشترك) له "الأسبقية" أعلى (6) من المشغل الشرطي/الثلاثي (15). أعلم أن الأرقام تظهر للخلف

الأولوية يعني ببساطة أن يتم تقييم كل نوع من المشغلات بلغة ما بترتيب محدد مسبقًا (وليس فقط من اليسار إلى اليمين).

المرجعي: أسبقية مشغل JavaScript

كيفية تغيير ترتيب التقييم:

الآن نحن نعرف لماذا يفشل ، تحتاج إلى معرفة كيفية جعلها تعمل.

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

الأداة في صندوق الأدوات الذي يمكنه تغيير ترتيب التقييم هو مشغل التجميع (ويعرف أيضا باسم قوسين). يقوم بذلك من خلال التأكد من تقييم التعبيرات في الأقواس قبل العمليات خارج الأقواس. هذا كل ما يفعلونه ، لكن هذا يكفي.

تعمل الأقواس ببساطة لأن لديهم (مشغلي التجمع) أسبقية أعلى من جميع المشغلين الآخرين ("يوجد الآن مستوى 0").

ببساطة عن طريق إضافة قوسين لك تغيير ترتيب التقييم لضمان إجراء الاختبار الشرطي أولاً ، قبل تسلسل السلسلة البسيطة:

h.className = h.className + (h.className ? ' error' : 'error')

سأترك الآن هذه الإجابة على Rust Unseen من بين الآخرين :)

أود اختيار شرح واين:

<variable> = <expression> ? <true clause> : <false clause>

دعنا ننظر في كلتا الحالتين:

case 1:
h.className += h.className ? 'true' : 'false'     
  • يعمل مشغل الواجب بشكل جيد ويتم إلحاق القيمة
  • عندما يركض لأول مرة ، O/P: خطأ
  • المرة الثانية. o/p: falsetrue - القيم تبقي الإلحاق

Case2: H.ClassName = H.ClassName + H.ClassName؟ 'خطأ صحيح'

  • النتيجة ليست هي الحالة 1
  • عندما يركض لأول مرة ، O/P: خطأ
  • المرة الثانية. O/P: FALSE - القيم لا تستمر في الإلحاق

explanation

في الكود أعلاه ، الحالة 1 تعمل بشكل جيد

في حين أن Case2:

h.className = h.className + h.className ? 'true' : 'false'
is executed as 
 h.className = (h.className + h.className) ? 'true' : 'false'

h.className + h.className => يعتبر تعبيرًا عن المشغل الثلاثي كمشغل ثلاثي الأسبقية أعلى. لذلك ، يتم تعيين نتيجة التعبير الثلاثية دائمًا

تحتاج إلى تحديد الأسبقية باستخدام قوسين

تحتاج إلى تحديد ترتيب التقييم الذي يجب مراعاته بمساعدة الأقواس للحالة 2 للعمل كحالة 1

h.className = h.className + (h.className ? ' error' : 'error') 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top