जावास्क्रिप्ट टर्नररी ऑपरेटर बनाम ||


17

मैं पहले कुछ नोड.जेएस कोड पर एक नज़र डाल रहा था, और मैंने देखा कि जिस व्यक्ति ने लिखा था, वह निम्नलिखित वाक्य रचना का पक्ष लेता था:

var fn = function (param) {
    var paramWithDefault = null == param ? 'Default Value' : param;
}

मैं जिस चीज़ को अधिक संक्षिप्त मानता हूं:

var fn = function (param) {
    var paramWithDefault = param || 'Default Value';
}

मैं सोच रहा था कि क्या दूसरा रूप वास्तव में सामाजिक रूप से स्वीकार्य जावास्क्रिप्ट सिंटैक्स है, मैंने इसे इस उद्देश्य के लिए टर्नरी ऑपरेटर की तुलना में अधिक बार जंगली में देखा है।

मैं ध्यान देता हूं कि पहले उदाहरण में वह डबल बराबर (ट्रिपल बराबर नहीं) का उपयोग कर रहा है, जिसका अर्थ है कि यह "अपरिभाषित" को शून्य के रूप में गिना जाएगा, जो एक प्रभाव को कम करेगा जिसे मैं सोच सकता था। हालाँकि, मैंने कई स्थानों पर पढ़ा है कि == जावास्क्रिप्ट में एक नहीं बल्कि एक बुरा ऑपरेटर है (JSLint इसके बहुत खिलाफ है, IIRC)।


2
टिप्पणीकार: टिप्पणियाँ स्पष्टीकरण मांगने के लिए होती हैं, न कि विस्तारित चर्चा के लिए। यदि आपके पास कोई समाधान है, तो एक उत्तर छोड़ दें। यदि आपका समाधान पहले से ही पोस्ट किया गया है, तो कृपया इसे बढ़ाएँ। यदि आप इस प्रश्न पर दूसरों से चर्चा करना चाहते हैं, तो कृपया चैट का उपयोग करें । अधिक जानकारी के लिए FAQ देखें ।

जवाबों:


17

क्योंकि यह कोड 0, "", गलत, या कुछ अन्य गलत मान में पारित 'डिफ़ॉल्ट मान' का मूल्यांकन करेगा।

function fn(param) {
  var paramWithDefault = param || 'Default Value';
  return paramWithDefault;
}

हो सकता है कि आप इस विशेष फ़ंक्शन का उपयोग करने पर आपको न काटें, लेकिन जब आप खाली तार या 0 या बूलियन जैसी चीजों में पास होने से बचते हैं, तो यह एक बुरा पैटर्न है।


आपको केवल एक ऑब्जेक्ट पर एक अशक्त coalesce का उपयोग करना चाहिए, और यदि कोई ऑब्जेक्ट परिभाषित किया गया है, तो यह काम नहीं करेगा। शायद खाली स्ट्रिंग के अपवाद के साथ।
मलफिस्ट

4
शून्य तुलना एक अच्छा बिंदु है, जो काफी अप्रत्याशित हो सकता है।
एड जेम्स

1
+1 - यह समस्या ठीक है कि पायथन (अंततः) ने "x यदि y और z" वाक्यविन्यास जोड़ा है। तार्किक ऑपरेटरों के लिए वे शब्दार्थ काफी सामान्य हैं, और जब भी मुहावरे चयन संचालकों के काम करने के लिए उन पर भरोसा करते हैं, तो वही सामान्य त्रुटियां फसल बन जाती हैं।
223 पर स्टीव 314

बस अपने निर्माणों को कोष्ठक में रखना न भूलें, यदि आप उन्हें एक साथ उपयोग करते हैं, तो स्ट्रिंग संघनन var txt = 'Hello, ' + (user_name||'User') + '!';काम करेगा, लेकिन बिना कोष्ठक के - आपको मिलेगा undefinedjsfiddle.net/4mFAB/1
c69

7

क्या आप वास्तव में जरूरत है एक अशक्त coalesce ऑपरेटर है। लेकिन यह देखकर कि जावास्क्रिप्ट वास्तव में एक नहीं है, प्रोग्रामर आमतौर पर 'का उपयोग करते हैं' || इसके लिए खड़े होना

हालांकि, दोनों पूरी तरह से उचित हैं। उन लोगों के लिए जो समझ में नहीं आते हैं कि एक अशक्त कोलेसस ऑपरेटर क्या है, टर्नरी ऑपरेटर को समझने की अधिक संभावना है।


एक अन्य संबंधित ऑपरेटर आइकन ऑपरेटर है जिसने IIRC "और" लिखा है। यह पहले तर्क से एक विशेष "विफल" परिणाम को पहचानता है, और एक विकल्प के रूप में उस मामले में दूसरे तर्क का उपयोग करता है। मैं चाहता हूं कि पायथन "x अगर y और z" दो अलग-अलग ऑपरेटरों का उपयोग करके कार्यान्वित किया गया - एक "यदि" बाइनरी अभिकथन ऑपरेटर और एक आइकन-जैसे "ऑपरेटर" - तो उन दो ऑपरेटरों के स्वतंत्र रूप से उपयोग करने योग्य होने के साथ। हालाँकि, आइकन ने उस शैली का समर्थन नहीं किया, बजाय रिश्तेदार ऑपरेटरों के साथ कुछ विचित्र करने के।
213 पर स्टीव 314

@ स्टीव ३१४: अजगर के पास कुछ ऐसा है जो आप चाहते थे: एक अलग ऑपरेटर के [false-part, true-part]साथ एक अलग अगर ऑपरेटर [..][bool(condition)]संयुक्त हो [false-part, true-part][bool(condition)]। यदि आप आलसी व्यवहार चाहते हैं, तो आप केवल सच्चे और झूठे हिस्से को लंबित कर सकते हैं।
रेयान

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