मुझे पता है कि यह एक बहुत पुराना सवाल है, लेकिन मैं किसी भी जवाब से 100% खुश नहीं हूं क्योंकि वे सभी अधूरे लगते हैं। तो यहाँ हम पहले प्राचार्यों से फिर से जाते हैं:
उपयोगकर्ता का समग्र उद्देश्य:
कोड को सारांशित करना: "मैं error
एक स्ट्रिंग में एक वर्ग का नाम जोड़ना चाहता हूं , वैकल्पिक रूप से एक अग्रणी स्थान के साथ यदि स्ट्रिंग में पहले से ही वर्ग के नाम हैं।"
सबसे सरल उपाय
जैसा कि कोबी ने बताया, 5 साल पहले, क्लास के नामों में अग्रणी स्थान होने से किसी भी ज्ञात ब्राउज़र के साथ कोई समस्या नहीं होगी, इसलिए सबसे कम सही समाधान वास्तव में होगा:
h.className += ' error';
यही कारण है कि किया जाना चाहिए था वास्तविक जवाब के लिए वास्तविक समस्या ।
हो सकता है कि जैसा भी हो, पूछे गए सवाल थे ...
1) यह काम क्यों किया?
h.className += h.className ? ' error' : 'error'
सशर्त / टर्नरी ऑपरेटर एक इफ स्टेटमेंट की तरह काम करता है, जो किसी वैरिएबल को इसके 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'
इसका कारण यह है कि अतिरिक्त ऑपरेटर ( +
आम लोगों के लिए) सशर्त / टर्नरी ऑपरेटर (15) की तुलना में अधिक "पूर्वता" (6) है। मुझे पता है कि संख्या पीछे की ओर दिखाई देती है
पूर्वता का सीधा सा मतलब है कि किसी भाषा में प्रत्येक प्रकार के ऑपरेटर का मूल्यांकन एक विशेष पूर्वनिर्धारित क्रम में किया जाता है (और सिर्फ बाएं से दाएं नहीं)।
मूल्यांकन के क्रम को कैसे बदलें:
अब हम जानते हैं कि यह क्यों विफल हो जाता है, आपको यह जानना होगा कि इसे कैसे काम करना है।
कुछ अन्य उत्तर पूर्वता को बदलने की बात करते हैं , लेकिन आप नहीं कर सकते । वरीयता भाषा में हार्ड-वायर्ड है। यह नियमों का एक निश्चित सेट है ... हालांकि, आप मूल्यांकन के क्रम को बदल सकते हैं ...
हमारे टूलबॉक्स में जो उपकरण मूल्यांकन के क्रम को बदल सकता है वह है ग्रुपिंग ऑपरेटर (उर्फ कोष्ठक)। यह यह सुनिश्चित करता है कि कोष्ठक के बाहर के संचालन से पहले कोष्ठक में अभिव्यक्तियों का मूल्यांकन किया जाए । बस इतना ही करते हैं, लेकिन इतना ही काफी है।
ब्रैकेट केवल इसलिए काम करते हैं क्योंकि वे (समूह ऑपरेटरों) अन्य सभी ऑपरेटरों की तुलना में अधिक पूर्वता रखते हैं ("अब एक स्तर 0 है")।
केवल ब्रैकेट्स जोड़कर आप सशर्त परीक्षण सुनिश्चित करने के लिए मूल्यांकन के क्रम को बदल देते हैं , पहले साधारण स्ट्रिंग संयोजन से पहले:
h.className = h.className + (h.className ? ' error' : 'error')
मैं अब इस उत्तर को दूसरों के बीच अनदेखी करने के लिए छोड़ दूंगा :)
h.className += ' error'
, यह स्ट्रिंग की शुरुआत में एक खाली स्थान भी छोड़ देता है अगर यह शुरू में खाली था। मेरा मानना है कि टर्नरी ऑपरेशन का बिंदु साफ दिखने वाले तार का उत्पादन करना है।