जावास्क्रिप्ट एकल लाइन 'अगर' कथन - सबसे अच्छा वाक्यविन्यास, यह विकल्प?


201

यह स्पष्ट रूप से रखा गया है, हालांकि राय किसी से कम नहीं है, कि एकल लाइन ifस्टेटमेंट पर घुंघराले कोष्ठक बनाए रखने और पठनीयता के लिए आदर्श नहीं है।

लेकिन इससे क्या?

if (lemons) { document.write("foo gave me a bar"); }

यह और भी अधिक संकुचित है, और यदि इसका विस्तार किया जाता है, तो घुंघराले कोष्ठक को भुलाया नहीं जाएगा। क्या कोई गंभीर समस्याएं हैं, और यदि नहीं, तो क्या विचार हैं? मुझे ऐसा लगता है कि यह अभी भी बहुत पठनीय है, कम से कम एक टर्नरी ऑपरेटर जितना भी। मुझे ऐसा लगता है कि टर्नरी ऑपरेटरों को पठनीयता के कारण उतना सुझाव नहीं दिया जाता है, हालांकि मुझे ऐसा लगता है कि यह निष्कर्ष एकमत नहीं है।

मेरे अंदर की बुराई जुड़वां यह सुझाव देना चाहती है, हालांकि वाक्यविन्यास स्पष्ट रूप से इसके लिए नहीं है, और शायद सिर्फ एक बुरा विचार है।

(syntax) ? document.write("My evil twin emerges"): "";

2
यदि जावास्क्रिप्ट वाक्यांश वाक्यांशों के अंत का समर्थन करता है तो अच्छा होगा:document.write("My evil twin emerges") if lemons
ब्यू स्मिथ

7
मुझे लगता है कि आप कम के बारे में सोच रहे होंगे, अन्यथा बयान। ( variable = (condition) ? true-value : false-value;।) सौभाग्य।
प्रोगो

जवाबों:


328

मैंने इसे &&प्राप्त करने के लिए उपयोग किए जाने वाले ऑपरेटर के लघु-परिचायक व्यवहार को देखा है , हालांकि जो लोग इसके आदी नहीं हैं उन्हें पढ़ने में मुश्किल हो सकती है या इसे एक विरोधी पैटर्न भी कह सकते हैं:

lemons && document.write("foo gave me a bar");  

व्यक्तिगत रूप से, मैं अक्सर ifब्रैकेट के बिना सिंगल-लाइन का उपयोग करूंगा , जैसे:

if (lemons) document.write("foo gave me a bar");

अगर मुझे और विवरण जोड़ने की आवश्यकता है, तो मैं अगली पंक्ति में कथनों को जोड़ूंगा और कोष्ठक जोड़ूंगा। चूंकि मेरी आईडीई स्वत: इंडेंटेशन करती है, इसलिए इस अभ्यास के लिए स्थिरता की आपत्तियां हैं।


11
मुझे बाद पसंद है। इनपुट के लिए धन्यवाद और पहले पर एक और रचनात्मक विकल्प!
डेविड हॉब्स

आपको पता होना चाहिए कि आप क्या उम्मीद कर रहे हैं, क्योंकि खाली स्ट्रिंग और 0 झूठे मूल्य हैं, यह दूसरे कथन को निष्पादित करने में विफल हो जाएगा
ऑरलैंडो

1
बेशक, आप बस वहाँ एक और अधिक स्पष्ट बूलियन बयान रख सकते हैं
acjay

7
@PeterOlson क्यों बनाए रखा जाता है आपत्ति आपत्ति? क्या होगा यदि कोई अन्य डेवलपर अपने आईडीई को इसके कॉन्फ़िगरेशन के साथ उपयोग नहीं करता है।
agconti

2
साहसी होने के लिए धन्यवाद अगर आप कोष्ठक के बिना कथन एकल पंक्ति के समर्थन में बोलते हैं। एक दिन हमारे बच्चे आपको धन्यवाद देंगे।
मार्क एम।

135

मैं इसे इस तरह से उपयोग करता हूं:

(lemons) ? alert("please give me a lemonade") : alert("then give me a beer");

35
alert(lemons?"please give me a lemonade":"then give me a beer")
श्रीवेकादजी

43

आप इस प्रारूप का उपयोग कर सकते हैं, जो आमतौर पर PHP में उपयोग किया जाता है:

(lemon) ? document.write("foo gave me a bar") : document.write("if condition is FALSE");

12
आपको कोष्ठक की आवश्यकता नहीं है lemon
लेमनैक्स

6
सशर्त विवरण के आसपास () शामिल करने के लिए सबसे अच्छा अभ्यास हो सकता है - अन्य डेवलपर्स के लिए संचालन आदि के आदेश के रूप में किसी भी भ्रम को दूर करता है। मैं आमतौर पर इसे निर्दिष्ट करने की दिशा में गलत तरीके से छोड़ता हूं जब किसी के लिए कोई रास्ता नहीं होता है कि वह भ्रमित होने के लिए योग्य हो।
djvs

1
document.write(lemon ? "foo gave me a bar" : "if condition is FALSE");:)
जोसेफ गोह

मुझे कोष्ठक पसंद हैं क्योंकि मेरे लिए वे एक बूलियन जबरदस्ती करते हैं।
डैनियल सोकोलोव्स्की

18

यह एक लाइन ज्यादा साफ है।

if(dog) alert('bark bark');

यह मेरे लिए ज़्यादा प्रधान है। आशा है कि यह किसी की मदद करता है


16

इसका उपयोग कर सकते हैं,

lemons ? alert("please give me a lemonade") : alert("then give me a beer");

स्पष्टीकरण: यदि lemonsमौजूद है तो मुझे एalert("please give me a lemonade") else alert("then give me a beer")


महान समाधान।
डेविडसन लीमा

1
lemons? alert("please give me a fancy beer with a lemon wedge in it"): alert(please give me a beer")FTFY
stib

15

// एक और सरल उदाहरण

 var a = 11;
 a == 10 ? alert("true") : alert("false");

15
बस क्यों नहीं .. var a = 11; alert(a === 10);?
मनुकाचारो

@ मैनुकरचो मुझे इस समस्या को बहुत बयान करता है जब टर्नरी बयानों के साथ काम करते हैं। मुझे लगता है कि ओपी केवल एक साधारण लिखने की कोशिश कर रहा है, लेकिन यह उस कोड में व्याप्त है जिसे मैंने काम पर पढ़ा था।
-बीक

alert(a === 10 ? "true" : "false")
जोश वुड

@JoshWood अलर्ट बूलियन को भी प्रिंट करेगा, इसलिए आप बस ऐसा कर सकते हैं alert(a===10)जैसे मनु ने कहा।
कीथ

12

जैसा कि बहुत से लोगों ने कहा है, यदि आप वास्तविक 1 लाइन की तलाश कर रहे हैं तो:

    if (Boolean_expression) do.something();

पसंद है। हालाँकि, यदि आप ऐसा करने के लिए देख रहे हैं, तो आप अपने दोस्त (और सुपर कूल भी) हैं:

    (Boolean_expression) ? do.somethingForTrue() : do.somethingForFalse();

यह भी:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

हालाँकि, मैंने एक बहुत अच्छा उदाहरण देखा। && के लिए @ पीटर-ऑस्ल्सन को चिल्लाओ

    (Boolean_expression) && do.something();

अंत में, यह एक स्टेटमेंट नहीं है, बल्कि एक लूप में चीजों को निष्पादित करना या तो एक मैप / कम या प्रोमिस.सेर्सोल () के साथ मजेदार है। @Brunettdan को चिल्लाता है


7

जैसा कि पहले ही कहा जा चुका है, आप उपयोग कर सकते हैं:

&& अंदाज

lemons && document.write("foo gave me a bar");  

या

ब्रैकेट-कम शैली

if (lemons) document.write("foo gave me a bar");

शॉर्ट सर्किट वापसी

यदि, हालांकि, आप ifकिसी फ़ंक्शन को शॉर्ट-सर्किट के लिए एक लाइन स्टेटमेंट का उपयोग करना चाहते हैं, तो आपको ब्रैकेट-कम संस्करण के साथ जाना होगा :

if (lemons) return "foo gave me a bar";

जैसा

lemons && return "foo gave me a bar"; // does not work!

आपको दे देंगे SyntaxError: Unexpected keyword 'return'


सिंगल-लाइन शॉर्ट-सर्किट में, हम 'वापसी' को छोड़ सकते हैं और इसे उम्मीद के मुताबिक काम करना चाहिए। `` नींबू && "फू ने मुझे एक बार दिया"; // काम करता है! `` `
सिवालिकम

@siwalikm आप समझा सकते हैं? यह उस मामले के लिए है जहां आप वापस नहीं लौटना चाहते lemons(यदि यह गलत है) - आप केवल "फू मुझे बार" लौटना चाहते हैं जब lemonsसच्चाई है।
मार्क

अगर (नींबू) वापसी "फू ने मुझे एक बार दिया"; ये गलत है। यह आपको "
बिना पढ़ा हुआ वाक्य रचना

@ क्या आप उस ब्राउज़र और संस्करण को साझा करेंगे जो आपको यह त्रुटि देता है? इसने लगभग 2 साल पहले मेरे लिए काम किया और मेरे लिए काम करना जारी रखा।
मार्क

4

मैंने कई मतों के साथ कई उत्तर देखे हैं जो टर्नरी ऑपरेटर के उपयोग की वकालत करते हैं। यदि आपके पास एक वैकल्पिक विकल्प है और ख) आप एक साधारण स्थिति से काफी साधारण मूल्य लौटा रहे हैं, तो टर्नरी महान है। परंतु...

मूल प्रश्न का कोई विकल्प नहीं था, और केवल एक एकल (वास्तविक) शाखा के साथ टर्नरी ऑपरेटर आपको एक सीमित उत्तर देने के लिए मजबूर करता है।

lemons ? "foo gave me a bar" : "who knows what you'll get back"

मुझे लगता है कि सबसे आम भिन्नता है lemons ? 'foo...' : '', और, जैसा कि आप किसी भी भाषा के लिए सही, गलत, सत्य, गलत, अशक्त, शून्य, रिक्त, खाली (हमारे बिना)? एक माइनफ़ील्ड (यद्यपि एक अच्छी तरह से प्रलेखित माइनफ़ील्ड।)

जैसे ही टर्नरी का कोई हिस्सा जटिल हो जाता है आप सशर्त के अधिक स्पष्ट रूप के साथ बेहतर हो जाते हैं।

यह कहने का एक लंबा तरीका है कि मैं मतदान कर रहा हूं if (lemons) "foo"


2

यह भी whileछोरों और ifइस तरह से एक लाइन का उपयोग करके किया जा सकता है :

if (blah)
    doThis();

यह whileछोरों के साथ भी काम करता है।



9
ओपी ने एक-लाइनर के लिए भी कहा।
एरन-कोडिंग

2

तीर कार्यों में उदाहरण:

let somethingTrue = true
[1,2,3,4,5].map(i=>somethingTrue && i*2)

वादों में:

Promise.resolve()
  .then(_=>checkTrueFalse && asyncFunc())
  .then(_=>{ .. })

अन्यथा:

if(somethingTrue) thenDo()

यदि यह सिर्फ एक साधारण स्थिति है, तो मैं जब भी संभव हो तो (मान) का उपयोग करना पसंद करता हूं क्योंकि यदि कथन की शुरुआत में शब्द पैरेन्थेसिस और प्रश्नचिह्न की तुलना में क्या हो रहा है, इसके बारे में अधिक कहता है।


1
**Old Method:**
if(x){
   add(x);
}
New Method:
x && add(x);

यहां तक ​​कि ऑपरेशन भी असाइन करें हम राउंड ब्रैकेट के साथ कर सकते हैं

exp.includes('regexp_replace') && (exp = exp.replace(/,/g, '@&'));

"यहां तक ​​कि ऑपरेशन भी असाइन करें हम राउंड ब्रैकेट के साथ कर सकते हैं"। यह बहुत दिलचस्प है, मुझे नहीं पता था कि इन एकल-लाइन संचालन के अंदर संचालन करना संभव था।
धनु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.