2013-06-19 10 views
17

जब मैं तार्किक opertor & & दोनों के बीच तार का उपयोग करें, क्यों यह मेरे आउटपुट के रूप में दूसरी स्ट्रिंग देता है:तार्किक ऑपरेटर && और दो तार जावास्क्रिप्ट में

var c = "Cat" && "Dog"; 

मुझे लगता है कि 0 के अपवाद के साथ , झूठी, शून्य, अपरिभाषित, "" - सबकुछ ऊपर एक जैसा तर्कसंगत अभिव्यक्ति में एक बुलियन सत्य के रूप में मूल्यांकन किया जाता है। लेकिन आउटपुट दूसरी स्ट्रिंग क्यों है और पहले नहीं? और आउटपुट क्यों न केवल "सच" है क्योंकि इसे एक बूलियन अभिव्यक्ति के रूप में मूल्यांकन किया जा रहा है।

धन्यवाद

+1

क्योंकि जेएस कैसे काम करता है, और सच्चाई बुलियन से परे फैली हुई है जैसा आप इंगित करते हैं। –

+0

इस संक्षिप्त उत्तर को देखें: [सबसे सरल शब्दों में] (http://stackoverflow.com/a/32158899) – Dewey

+0

यह उत्तर देखें [सरल शर्तों में] (http://stackoverflow.com/a/32158899) – Dewey

उत्तर

17

अभिव्यक्ति

"Cat" && "Dog" 
// => "Dog" 

क्योंकि आप && उपयोग कर रहे हैं में, जावास्क्रिप्ट आप का वादा किया जाता है कि अभिव्यक्ति के दोनों ओर true हैं कि यह सत्यापित करेंगे। इस मामले में, "Dog" सिर्फ अंतिम मूल्यांकन की गई चीज़ है।

अधिक स्पष्ट होने के लिए, आप की तरह

var c = "Cat" != null && "Dog" != null 

कुछ कर सकते हैं यह थोड़ा और अधिक शब्दों वाले है, लेकिन इस

var c = true && true 
// => true 

करने पर निर्भर करता आप बूलियन

के लिए एक सरल शॉर्टकट चाहते हैं
var c = !!("Cat" && "Dog") 
// => true 

यदि आप बस एक साधारण आरईपीएल या जावास्क्रिप्ट कंसोल का उपयोग करते हैं, तो आप थि को देख पाएंगे एस आउटपुट बहुत आसानी से।


नीचे

|| का उपयोग टिप्पणियों में से एक के अनुसार, जावास्क्रिप्ट आप का वादा किया गया है कि कम से कम एक पक्षों केtrue है। चूंकि "बिल्ली" सच है, यह वहां रुक जाता है और "बिल्ली" देता है। इसे Short-circuit evaluation

+0

" कुत्ता "आखिरी मूल्यांकन की गई चीज़ है? "बिल्ली" के बारे में क्या || "कुत्ता" (=> "बिल्ली") तो? –

+1

@su, मैंने अपने उत्तर में एक अनुभाग जोड़ा जो आपके प्रश्न को संबोधित करता है :) – naomik

+0

आप सही हैं। धन्यवाद। –

8

मुझे लगता है कि यह तार्किक ऑपरेटर & & की प्रकृति के कारण है। जावास्क्रिप्ट अभिव्यक्ति "cat" && "Dog" निम्नलिखित तरीके से निष्पादित करता है:

मूल्य "बिल्ली" की जांच करता है - यह "", 0, शून्य, अपरिभाषित या गलत से कुछ और देता है और सत्य है। जावास्क्रिप्ट && देखता है और इसलिए यह अभिव्यक्ति जारी रखता है और चेहरे "कुत्ते" का सामना करता है, जो कि "", 0, शून्य, अपरिभाषित या गलत से कुछ और है और सत्य है, अभिव्यक्ति समाप्त होती है और अभिव्यक्ति इसे अंतिम मूल्य की जांच करती है।

आप &&|| साथ भाव की जगह तो पहले truthy मूल्य पर समाप्त होता है और जिस तरह

var boolean = "cat" || "dog" 

रिटर्न पहला मान thats: cat

+1

+1 हाँ, यह वास्तव में तर्क ऑपरेटरों 101 पर आता है, है ना? :) अच्छा लिखो। – naomik

6

उत्तर @naomik काफी यह शामिल किया गया है। यदि आप गहरे जाना चाहते हैं, तो मैं सुझाव देता हूं कि ईसीएमएस्क्रिप्ट विनिर्देश, धारा 11 देखें।11:

http://www.ecma-international.org/ecma-262/5.1/#sec-11.11

"शब्दार्थ" अनुभाग में, हम देख सकते हैं:

उत्पादन LogicalANDExpression: LogicalANDExpression & & BitwiseORExpression के रूप में मूल्यांकन किया जाता है इस प्रकार है:

  1. lrefलॉजिकलैंडएक्सप्रेस का मूल्यांकन करने का परिणाम बनें।
  2. lval GetValue (lref) दें।
  3. यदि ToBoolean (lval) झूठा है, lval पर वापस लौटें।
  4. rrefबिटवायरएक्सप्रेस का मूल्यांकन करने का परिणाम बनें।
  5. रिटर्न GetValue (rref)।
+0

यह प्रश्न 3 साल का है, दूसरा जवाब क्यों पोस्ट करें? – Scott

+3

क्योंकि मुझे अभी यह पता चला है, और सोचा था कि मेरे पास साझा करने के लिए थोड़ा अतिरिक्त ज्ञान था जिसे पहले साझा नहीं किया गया था;) मुझे नहीं लगता कि प्रश्नों पर एसओ पर "समाप्ति तिथि" है :) –

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