इफ-शॉर्टहैंड का उपयोग करते समय दूसरी अभिव्यक्ति को स्वीकार करना


290

क्या मैं if elseबिना शॉर्टहैंड के लिख सकता हूं else?

var x=1;

x==2 ? dosomething() : doNothingButContinueCode();   

मैंने nullअन्य कार्यों के लिए ध्यान दिया है (लेकिन मुझे पता नहीं क्यों या अगर यह एक अच्छा विचार है)।

संपादित करें: आप में से कुछ को यह प्रतीत होता है कि मैं ऐसा करने की कोशिश क्यों कर रहा हूं। बाकी का आश्वासन दिया यह पूरी तरह से जिज्ञासा से बाहर है। मुझे जावास्क्रिप्ट के साथ गड़बड़ करना पसंद है।


मुझे लगता है कि एक var | varवाक्यविन्यास है। विशेष रूप से "देखना" मुश्किल है, विशेष रूप से (IMO) टर्नरीज़ समस्याग्रस्त होने के कारण सावधान। किफायत से इस्तेमाल करो।
जारेड फरिश

@JaredFarrish बयानों का उपयोग करने की तुलना में "देख" करने के लिए आसान नहीं है कि ternaries के पूरे बिंदु नहीं है? यह भी कि आप किस सिंटेक्स की बात कर रहे हैं, यह दिलचस्प लग रहा है।
हसन

1
नहीं, मुझे नहीं लगता कि वे सभी मामलों में आसान हैं। मेरे दिमाग में "पूरा बिंदु" या तो यह सब एक लाइन पर रखा गया है ("मेरे कोड आपके से छोटे हैं") या विशिष्ट, शाब्दिक परिणामों के साथ शाब्दिक मामलों के लिए। स्टैकिंग टर्नरी विशेष रूप से खतरनाक है और इसे हर कीमत पर बचा जाना चाहिए। :)
जारेड फरिश

1
@ हसन - मैंने कुछ ऐसा देखा है foo = bar | cat;, जहां अगर पहला झूठ है? अशक्त ?, यह "से होकर गिरता है" दूसरे तक। मैंने केवल इसे देखा है, हालांकि, और इसका उपयोग नहीं करते हैं।
जारेड फरिश

3
@JaredFarrish: यह a || bया a && b, अन्यथा bहमेशा मूल्यांकन किया जाएगा।
kennytm

जवाबों:


263

यह भी एक विकल्प है:

x==2 && dosomething();

dosomething()केवल तभी कहा जाएगा जब x==2सच का मूल्यांकन किया जाएगा। इसे शॉर्ट-सर्कुइंग कहा जाता है ।

यह आमतौर पर इस तरह के मामलों में उपयोग नहीं किया जाता है और आपको वास्तव में इस तरह कोड नहीं लिखना चाहिए। मैं इस सरल दृष्टिकोण को प्रोत्साहित करता हूं:

if(x==2) dosomething();

आपको हर समय पठनीय कोड लिखना चाहिए; यदि आप फ़ाइल आकार के बारे में चिंतित हैं, तो कई जेएस कम्प्रेसर में से एक की मदद से इसका एक छोटा संस्करण बनाएं। (उदाहरण के लिए गूगल के क्लोजर कंपाइलर )


10
ओह, शॉर्ट-सर्किटिंग, राइट। कोड पठनीयता की सराहना की जा रही है, मुझे लगता है कि अधिकांश मध्यवर्ती डेवलपर्स और कुछ "अनुभवी पेशेवर" हैं।
जारेड फरिश

2
तकनीकी रूप से आपको ब्रेसिज़ की आवश्यकता नहीं है: if (1 - 1 === 0) $('.woot').text('Woot!'); मैं हर समय PHP के साथ उस फॉर्म का उपयोग करता हूं, और अब जब मैं कॉफ़ीस्क्रिप्ट को अपना रहा हूं, तो मैं इसे अपनी जावास्क्रिप्ट में भी उपयोग करता हूं।
होलेनबेक

5
मैं व्यक्तिगत रूप से विश्वास करता हूं कि अगर यह एक छोटा है अगर एक परिणाम के साथ यदि सच है .. तो इसके तेज और आसान लिखने के लिए x == 2 && dosomething ();
डीन मेहान

9
if x==2 && doSomething() || doSomethingElse()
अगस्टिन

1
काश जावास्क्रिप्ट में यह रूबी जैसा सिंटैक्स शामिल होता doSomething() if x === 2:। मैं रूबी को याद नहीं करता, लेकिन मुझे वह याद आता है।
चाड जॉनसन

743

आपके पास जो कुछ भी है, वह टर्नरी ऑपरेटर का काफी असामान्य उपयोग है । आमतौर पर इसका उपयोग अभिव्यक्ति के रूप में किया जाता है, न कि किसी कथन के अंदर, किसी अन्य ऑपरेशन के अंदर, जैसे:

var y = (x == 2 ? "yes" : "no");

इसलिए, पठनीयता के लिए (क्योंकि आप जो कर रहे हैं वह असामान्य है), और क्योंकि यह "और" से बचता है जो आप नहीं चाहते हैं, मैं सुझाव दूंगा:

if (x==2) doSomething();

यहाँ हम एक पूर्ण कमांड के रूप में डाली गई फ़िनिशिंग लाइन को जोड़ सकते हैं (जैसा कि मेरा उदाहरण jquery फीका इन एंड फेक आउट फंक्शन) x = 2 है? $ (तत्व) .fadeIn (): $ (तत्व) .fadeIn (); रिटर्न वैरिएबल होना अनिवार्य नहीं है (जैसे पहले कोड में var y)।
प्रागेथ देवता

1
आपको तर्क पूर्ण होने के लिए ट्रिपल "=" संकेतों का उपयोग करना चाहिए। जैसा कि var y = (x === 2; "हाँ": "नहीं");
फिनो


20

यदि आप दूसरे को नहीं कर रहे हैं, तो क्यों नहीं:

if (x==2) doSomething();

4
आप इसे तब भी कर सकते हैं जब आप और करते हैं
nmirceac

14

का उपयोग करना nullएक टर्नरी अभिव्यक्ति की शाखाओं में से एक के लिए ठीक है। और एक अभिव्यक्ति ternary जावास्क्रिप्ट में एक बयान के रूप में ठीक है।

हालांकि, यदि आप किसी प्रक्रिया को लागू करने का मन बना रहे हैं, तो शैली के रूप में, यह स्पष्ट है कि अगर यह प्रयोग किया जाए तो इसे लिखें:

if (x==2) doSomething;
else doSomethingElse

या, आपके मामले में,

if (x==2) doSomething;

6

इस बहुत पुराने धागे के अलावा छोटे ..

यदि आपका एक टर्नरी ऑपरेटर के साथ for/ whileलूप के अंदर एक अभिव्यक्ति का मूल्यांकन कर रहा है , और इसके परिणामस्वरूप continueया इसके लिए breakआप चाहते हैं - आपको एक समस्या है क्योंकि दोनों continueऔर भावbreak नहीं हैं , तो वे बिना किसी मूल्य के कथन हैं ।

इससे उत्पादन होगा Uncaught SyntaxError: Unexpected token continue

 for (const item of myArray) {
      item.value ? break : continue;
 }

यदि आप वास्तव में एक-लाइनर चाहते हैं जो एक बयान लौटाता है, तो आप इसके बजाय इसका उपयोग कर सकते हैं:

  for (const item of myArray) {
      if (item.value) break; else continue;
  }
  • PS - यह कोड कुछ भौहें बढ़ा सकता है। बस केह रहा हू.. :)

4

तकनीकी रूप से, अशक्त या 0, या बस कुछ यादृच्छिक मूल्य वहाँ काम करता है (क्योंकि आप वापसी मूल्य का उपयोग नहीं कर रहे हैं)। हालाँकि, आप निर्माण के बजाय इस निर्माण का उपयोग क्यों कर रहे हैं if? यह कम स्पष्ट है कि आप इस तरह से कोड लिखते समय क्या करने की कोशिश कर रहे हैं, जैसा कि आप लोगों को नो-ऑप (आपके मामले में अशक्त) के साथ भ्रमित कर सकते हैं।


2

संभवतः सबसे छोटा ( OR ऑपरेटर और उसकी पूर्वता पर आधारित )

x-2||dosomething()

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