2013-11-26 14 views
12

सी में मैं क्रमशः 1 और 0 के लिए सही और गलत मूल्यांकन जानता हूं। इस मामले में show बस स्क्रीन पर प्रिंट करता है ... सुनिश्चित नहीं है कि यहां क्या हो रहा है। मुझे true वापस पाने की उम्मीद है। यह 1 मेरे कर्म को गड़बड़ कर रहा है।क्यों (true && 1) 1 लौटाता है, लेकिन (1 && true) सत्य लौटाता है?

show(1 && true); 
true 



show(true && 1); 
1 
+1

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

उत्तर

23

सीधे शब्दों में कहें - कि कैसे && परिभाषित किया जाता है। जावास्क्रिप्ट में, a && ba लौटाता है यदि a गलत है और b है यदि a सत्य है।

इसके विपरीत a || b रिटर्न a अगर a truthy है और b अगर a falsy है।

यह सहजता से समझ में आता है - अगर aa && b में गलत है, तो शेष अभिव्यक्ति को पढ़ने में परेशानी क्यों है? आप पहले से ही जानते हैं कि पूरी बात झूठी है। तो बस झूठी वापसी करें। लेकिन जावास्क्रिप्ट a वापस करने का निर्णय लेता है, जो कि कहीं भी वापस आने के लिए मूल्य false बनाने के बजाय झूठा है।

यह सभी सी-शैली भाषाओं के लिए सामान्य शॉर्ट-सर्किट मूल्यांकन पर आधारित है।

यह जावास्क्रिप्ट में बहुत अधिक अभिव्यक्ति की अनुमति देता है। उदाहरण के इस पैटर्न के लिए:

var foo = function(opts) { 
    opts = opts || {} 
    // ... 
} 

एक वैकल्पिक पैरामीटर opts लागू करता है। यदि opts बिलकुल पास नहीं हुआ है, तो opts = opts || {}opts से {} सेट करेगा, इसलिए शेष कोड को opts नहीं पता था।

var x = a || b; // is equivalent to 
var x; 
if(a) { 
    x = a; 
} 
else { 
    x = b; 
} 

और

var y = a && b; // is equivalent to 
var y; 
if(!a) { 
    y = a; 
} 
else { 
    y = b; 
} 

इसलिए जावास्क्रिप्ट बहुत सी या जावा की तुलना में अधिक संक्षिप्त हो सकता है, क्योंकि साधारण if बयान से बदला जा सकता है:

लंबे समय से हाथ में यह करने के लिए निम्न बराबर है || या && पूरी तरह से। कभी-कभी यह कोड को अधिक तेज़ और कम पठनीय बनाता है और पर्ल की तरह अधिक होता है, अन्य बार यह opts = opts || {} जैसे नए जावास्क्रिप्ट पैटर्न की अनुमति देता है।

एक अन्य प्रयोग की तरह

var displayName = user.fullname || user.email; 

जिसका मतलब है पैटर्न में है "उपलब्ध पूरा नाम यदि का उपयोग करें;। यदि नहीं, तो ईमेल में वापस आने" मुझे व्यक्तिगत रूप से यह अभिव्यक्तिपूर्ण और पठनीय लगता है, लेकिन यह आपके द्वारा प्राप्त जावास्क्रिप्ट समुदाय के किस हिस्से के आधार पर तर्कसंगत और अस्पष्ट है। इस तरह के उदाहरणों के कारण, और अनिवार्य रूप से तथ्य यह है कि सत्य मूल्य अधिक विविध होते हैं, तो शॉर्ट-सर्किट || का उपयोग करते हुए झूठी मान, शॉर्ट सर्किट && से आपके प्रश्न के मुकाबले कहीं अधिक आम है।

+0

यह एक उत्कृष्ट जवाब है। धन्यवाद। –

+0

जावास्क्रिप्ट में & amp || का उपयोग करने के लिए यह काफी आम है बयान के लिए सरल के लिए सम्मेलन? मुझे यह पसंद है कि यह कितना संक्षिप्त है। –

+1

@ किथग्राउट मैंने जो दोनों उदाहरण दिए हैं, वे मेरी कंपनी में उत्पादन कोड में उपयोग किए जाते हैं। यह तर्कसंगत रूप से terse और "चालाक" और अपठनीय है लेकिन कई लोग इसे एक आम पैटर्न के रूप में स्वीकार करते हैं। यह आपका निर्णय कॉल है। – djechlin

संबंधित मुद्दे