जावास्क्रिप्ट टर्नररी ऑपरेटर के साथ ऑपरेटर की प्रक्रिया


116

मैं इस कोड के पहले भाग (+ =) के चारों ओर अपना सिर लपेटने के लिए लगता है कि टर्नरी ऑपरेटर के साथ।

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

जिस तरह से मुझे लगता है कि यह कोड काम करता है वह इस प्रकार है:

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

लेकिन यह सही नहीं है क्योंकि यह मेरे कंसोल में त्रुटि देता है।

तो मेरा सवाल यह है कि मुझे इस कोड को सही ढंग से कैसे करना चाहिए?

जवाबों:


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

आप चाहते हैं कि ऑपरेटर इसके लिए काम करे h.className, इसके बारे में बेहतर होना चाहिए।
बेशक, इससे कोई नुकसान नहीं होना चाहिए h.className += ' error', लेकिन यह एक और मामला है।

इसके अलावा, ध्यान दें कि +टर्नररी ऑपरेटर पर पूर्वता है: जावास्क्रिप्ट ऑपरेटर प्रीसेडेंस


3
मुझे लगता है कि यह ध्यान दिया जाना चाहिए, जबकि इससे कोई नुकसान नहीं होना चाहिए h.className += ' error', यह स्ट्रिंग की शुरुआत में एक खाली स्थान भी छोड़ देता है अगर यह शुरू में खाली था। मेरा मानना ​​है कि टर्नरी ऑपरेशन का बिंदु साफ दिखने वाले तार का उत्पादन करना है।
JMTyler

@ जेएम टायलर - ठीक यही मैं संकेत कर रहा था - अगर यह सब शुरू से ही एक जगह बनाए रखने के लिए किया जाता है, तो मैं इसके लायक नहीं हूं। (एज केस में सटीक jQuery या XPath चयनकर्ता शामिल हैं)। कोई बात नहीं धन्यवाद।
कोबी

अकेले परिचालक चेतावनी के लिए @Kobi +1!
एड चैपल

129

इस पर इस तरीके से विचार करें:

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

जिस तरह से वक्तव्य को निष्पादित किया जाता है वह मूल रूप से इस प्रकार है:

  1. क्या <expression>सच का मूल्यांकन करता है, या यह झूठ का मूल्यांकन करता है?
  2. यदि <expression>सत्य का मूल्यांकन किया जाता है, तो इसके मान <true clause>को असाइन किया जाता है <variable>, <false clause>इसे अनदेखा किया जाता है, और अगले कथन को निष्पादित किया जाता है।
  3. यदि <expression>असत्य का मूल्यांकन किया जाता है, तो <true clause>इसे नजरअंदाज कर दिया जाता है और इसका मान <false clause>निर्दिष्ट किया जाता है <variable>

इस और अन्य भाषाओं में टर्नरी ऑपरेटर के साथ महसूस करने के लिए महत्वपूर्ण बात यह है कि जो भी कोड <expression>होना चाहिए उसका मूल्यांकन करते समय एक बूलियन परिणाम उत्पन्न करना चाहिए: या तो सही या गलत।

आपके उदाहरण के मामले में "जोड़ा गया" के साथ मेरे स्पष्टीकरण में "असाइन किया गया", या जो भी आप उपयोग कर रहे हैं, शॉर्टहैंड अंकगणित के लिए समान है, यदि कोई हो।


ध्यान दें कि अगर सही टिप्पणी उपयुक्त है :) यह किसी भी स्पष्टीकरण को छोड़ देता है कि बाएं हाथ के भाव "पहले से एक साथ" समूहित क्यों होते हैं (अर्थात क्योंकि +सशर्त / टर्नरी ऑपरेटर की तुलना में अधिक पूर्वता है (वास्तव में सशर्त ऑपरेटर लगभग हमेशा अंतिम होता है) किसी भी अभिव्यक्ति में मूल्यांकन किया गया)
कोडिंग किया गया

10

वह +=करता है जो आप चाहते हैं, लेकिन उसके दाहिने हाथ में h.classNameतिर्यक कथन में, यह जाँचता है कि क्या यह गलत है, जो कि अगर यह अपरिभाषित था तो होगा। यदि यह सत्य है (अर्थात यदि एक वर्ग नाम पहले से ही निर्दिष्ट है), तो त्रुटि को एक स्थान (यानी एक नया वर्ग जोड़ने ) के साथ जोड़ा जाता है, अन्यथा यह अंतरिक्ष के बिना जोड़ा जाता है।

जैसा कि आप सुझाव देते हैं, कोड फिर से लिखा जा सकता है, लेकिन आपको यह निर्दिष्ट करने की आवश्यकता है कि h.classNameइसका उपयोग सत्यता-तुलना के लिए किया जाना चाहिए, इसके वास्तविक मूल्य का उपयोग करने के बजाय, टर्नरी ऑपरेटर में, इसलिए सुनिश्चित करें कि आप मूल्यों के संघटन से परेशान नहीं हैं अपने टर्नरी ऑपरेशन को करने के साथ ही:

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

13
ठीक है, यह गलतundefined नहीं है क्योंकि इसे वैसे ही माना जाता है जैसे
डेविड हेडलंड

4

=ऑपरेटर के दाहिने हाथ की ओर बाएं से दाएं मूल्यांकन किया जाता है। इसलिए,

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');


1

मुझे पता है कि यह एक बहुत पुराना सवाल है, लेकिन मैं किसी भी जवाब से 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')

मैं अब इस उत्तर को दूसरों के बीच अनदेखी करने के लिए छोड़ दूंगा :)


1

मैं वेन का स्पष्टीकरण लेना चाहूंगा:

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

आइए दोनों मामलों पर विचार करें:

case 1:
h.className += h.className ? 'true' : 'false'     
  • असाइनमेंट ऑपरेटर ठीक काम करता है और मूल्य जुड़ जाता है
  • जब पहली बार चलता है, ओ / पी: असत्य
  • दूसरा समय। o / p: falsetrue - मान जुड़ते रहते हैं

case2: h.className = h.className + h.className? 'सही गलत'

  • परिणाम केस 1 जैसा नहीं है
  • जब पहली बार चलता है, ओ / पी: असत्य
  • दूसरा समय। o / p: गलत - मानों को जोड़कर नहीं रखता है

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=> टर्नरी ऑपरेटर के लिए अभिव्यक्ति के रूप में माना जाता है क्योंकि टर्नेरी ऑपरेटर को उच्च वरीयता दी जाती है। इसलिए, हमेशा टर्नरी अभिव्यक्ति का परिणाम सिर्फ सौंपा गया है

आपको कोष्ठक का उपयोग करके पूर्वता को परिभाषित करने की आवश्यकता है

आपको केस 1 के रूप में काम करने के लिए केस 2 के लिए कोष्ठक की मदद से विचार किए जाने वाले मूल्यांकन के क्रम को परिभाषित करने की आवश्यकता है

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

1
यहाँ शब्दावली बहुत सही नहीं है। पूर्वगामी भाषा में निहित है, आप इसे परिभाषित नहीं करते हैं । आप इसके बजाय कोष्ठक (जो अन्य सभी संचालकों की तुलना में उच्च पूर्वता रखते हैं) शुरू करके मूल्यांकन के क्रम को परिभाषित कर रहे हैं ।
कोडिंग किया

@TrueBlueAussie मैं इसे स्वीकार करता हूं। मैं आपके इरादे पढ़ने के लिए सराहना करता हूं +1
एंजेलिन नादर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.