2016-03-11 16 views
6

मैं सी # का उपयोग कर जावास्क्रिप्ट ब्लॉक संकलित करने के लिए छोटी उपयोगिता बना रहा हूं। मैं टर्नरी ऑपरेटर के निष्पादन प्रवाह को समझने की कोशिश कर रहा हूं। अब जब मैं एक जावास्क्रिप्ट Chrome या Firefox का उपयोग कर चला रहा हूँ:जावास्क्रिप्ट टर्नरी ऑपरेटर परिणाम

var k = 27; 
var o = 78; 
var a = k < 100 ? o+=2 > 11 ? "T" : "F" : o < 100 ? "J" : "P"; 
alert(a); 

यह अगर "ओ + = 2" झूठे रिटर्न मुझे परिणाम "टी" या 'एफ' देना होना चाहिए। लेकिन इसके बजाय यह "78F" देता है। क्या कोई मुझे बता सकता है कि इसके पीछे तर्क क्या है।

+11

मैं नहीं नेस्टिंग त्रिगुट ऑपरेटरों की सिफारिश करेंगे मूल्यांकन किया जाता है। हालांकि एक-लाइनर रखना हमेशा अच्छा होता है, अन्य डेवलपर्स के लिए यह समझना बहुत आसान होता है कि यदि आप इसे और अन्य कथन में विभाजित करते हैं। मुझे एक बार भागों में 6 नेस्टेड टर्नरी के साथ एक आवेदन पर काम करना पड़ा।यह डीबग करने के लिए एक जानवर था। – HockeyJ

+1

कृपया अभिव्यक्तियों को अलग करने के लिए ब्रेसिज़ '(' और ')' का उपयोग करें और हर किसी की आंखों के लिए इसे आसान बनाएं। यह शायद आपको वांछित परिणाम भी देगा। – Aukhan

+1

Nesting ternaries एक भयानक विचार है .. – rlemon

उत्तर

9

operator precedence table के आधार पर:

असाइनमेंट ऑपरेटरों एक तुलना ऑपरेटर की तुलना में कम प्राथमिकता है।

तो अपने कोड के नीचे की तरह, मूल्यांकन किया जाएगा

  1. वर एक = k < 100? ओ + = 2> 11? "टी": "एफ": ओ < 100? "जे": "पी";
  2. var a = true? ओ + = 2> 11? "टी": "एफ": ओ < 100? "जे": "पी";
  3. var a = true? ओ + = false? "टी": "एफ": ओ < 100? "जे": "पी";
  4. var a = true? ओ + = "F": ओ < 100? "जे": "पी";
  5. var a = true? "78F": ओ < 100? "जे": "पी";
  6. वर एक = "78F"

और तुम शर्त समूहीकरण एक कोष्ठक का उपयोग करके व्यवहार सही कर सकते हैं,

var a = (k < 100) ? (o+=2) > 11 ? "T" : "F" : (o < 100) ? "J" : "P"; 
console.log(a); // T 
1

आप o के बजाय सिर्फ + पर += उपयोग कर रहे हैं।

var a = k < 100 ? o+2 > 11 ? "T" : "F" : o < 100 ? "J" : "P"; 

इसके अलावा कोष्ठकों का उपयोग यह अधिक पठनीय कर देगा:

var a = (k < 100 ? (o+2 > 11 ? "T" : "F") : (o < 100 ? "J" : "P")); 
3
var k = 27; 
var o = 78; 
var a = k < 100 ? (o+=2) > 11 ? "T" : "F" : o < 100 ? "J" : "P"; 
alert(a); 

कोड से ऊपर काम करता है आप से अपेक्षा के अनुरूप। आपने शायद सोचा था कि += ऑपरेटर पहले संसाधित किया जाएगा।

1

यह वास्तव में की तरह k < 100 ? o += (2 > 11 ? "T" : "F") : (o < 100 ? "J" : "P");

काम कर रहा है क्योंकि असाइनमेंट ऑपरेटर = के दाईं ओर कुछ भी सही क्रम में पहले संसाधित किया जाता है वाम में, है, तो 2 > 11 ? "T" : "F" पहले

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