2014-09-24 8 views
10

मैं Mithril.js में इस कोड को भर में आया था:`(राज्य == 1 और 3) 'क्यों समझ में आता है?

finish(state == 1 && 3) 
मेरी (जावा/सी प्रोग्रामर के) आंखों के लिए

ऐसा लगता है कि यह हमेशा आह्वान चाहिए finish(true) अगर state1 और finish(false) है अगर state1 नहीं है। लेकिन यह वास्तव में पूर्व के लिए finish(3) और finish(false) के लिए लगता है।

इसके पीछे तर्क क्या है?

क्या यह जावास्क्रिप्ट में बेवकूफ है, या यह एक बुरा विचार है? मेरे लिए यह बेहद अस्पष्ट है।

+0

तो राज्य == 1, अभिव्यक्ति 3. – kennebec

उत्तर

8

यह जावास्क्रिप्ट की एक विशेषता है, & & और || ऑपरेटर हमेशा मूल्यांकन किए गए अंतिम मूल्य को वापस करते हैं।

+3

के एक मूल्य तो यह 'खत्म (राज्य == 1 3: झूठी?) के बराबर है है जो IMO इतना स्पष्ट है',? जावास्क्रिप्ट के साथ परिचितता बढ़ाना ओपी मुहावरे की अस्पष्टता को कम करता है? –

+2

@LawrenceDol: हाँ, परिचितता इसे स्पष्ट बनाता है। हालांकि '||' का उपयोग अक्सर मुझे लगता है। आमतौर पर मूल्यों को डिफॉल्ट करने के लिए। ('ए = ए || 'डिफ़ॉल्ट';' एक फ़ंक्शन की पहली पंक्ति के रूप में जो पैरामीटर के रूप में 'a' लेता है) – njzk2

8

जावास्क्रिप्ट में, && ऑपरेटर परिणाम को बूलियन पर मजबूर नहीं करता है। बाईं ओर के truthiness परीक्षण, तो या तो सही लौटने जब truthy या अन्यथा छोड़ दिया

var _temp = state == 1; 
finish(_temp ? 3 : _temp); 

: यह बजाय के समान है।

A || B 
→ A ? A : B 

    A && B 
→ A ? B : A 

लेकिन A दो बार के मूल्यांकन के बिना:

13

आप ऑपरेटरों || और && उस तरह व्याख्या कर सकते हैं।

4

तुलना a && b वास्तव में अभिव्यक्ति में मूल्यांकन किए गए अंतिम मूल्य को मानता है और true या false नहीं।

आप spec का उल्लेख कर सकते हैं:

उत्पादन LogicalANDExpression:

  1. lref परिणाम हो: LogicalANDExpression & & BitwiseORExpression इस प्रकार मूल्यांकन किया जाता है ओ एफ का मूल्यांकन LogicalANDExpression
  2. lval GetValue (lref) दें।
  3. यदि ToBoolean (lval) झूठा है, lval पर वापस लौटें।
  4. rrefबिटवायरएक्सप्रेस का मूल्यांकन करने का परिणाम बनें।
  5. रिटर्न GetValue (rref)।
संबंधित मुद्दे