2010-02-22 15 views
20
for (var count = 1; count < 6; count++) { 
    switch (count) { 
     case (2): document.write("hi"); break;  
     case (count > 3): document.write("bye"); break;  
     case (count >= 4): document.write("lol"); break; 
    } 
} 

क्योंकि यह मेरे द्वारा अपेक्षित तरीके से काम नहीं कर रहा है, अलविदा और लॉल प्रिंट नहीं कर रहा है, इससे मुझे लगता है कि यह जावास्क्रिप्ट में अमान्य है। मैंने यह देखने के लिए कुछ उदाहरण ढूंढने की कोशिश की कि क्या लोग Google पर ऐसा करते हैं, और मैंने कोई नहीं देखा। तो क्या यह मान्य है या नहीं? या यह क्यों काम नहीं कर सकता है?तार्किक ऑपरेटरों के साथ जावास्क्रिप्ट स्विच?

उत्तर

67

जब switch व्याख्या की जाती है, तो कोष्ठक में अभिव्यक्ति की तुलना विशेष मामलों के मूल्यों से की जाती है।

तो आपके मामले में count का मान 2, count > 3 और count >= 4 के मानों की तुलना में किया जाएगा। और वह काम नहीं करेगा। हालांकि आप इसे फिर से लिखने और true तुलना कर सकते हैं यह काम कर पाने के:

switch (true) { 
    case (count == 2): 
     document.write("hi"); 
     break; 
    case (count > 3): 
     document.write("bye"); 
     break; 
    case (count >= 4): 
     document.write("lol"); 
     break; 
} 

लेकिन वह कैसे switch इस्तेमाल किया जा माना जाता है नहीं है।

उपयोग if बयानों के बजाय:

if (count == 2) { 
    document.write("hi"); 
} else if (count > 3) { 
    document.write("bye"); 
} else if (count >= 4) { 
    document.write("lol"); 
} 

संपादित जब से तुम switch मामलों विशेष रूप से उपयोग करें (यदि एक मामले से मेल खाता तोड़), मेरे switch -to- if/else अनुवाद सही है।

लेकिन चूंकि count > 3 सच (भी) बराबर 4.

अधिक से अधिक count मूल्यों या इस समस्या को दूर करने के लिए के लिए है count >= 4 मामले/शाखा लागू किया कभी नहीं किया जाएगा ("अलविदा" लिखने और "lol" मूल्यों के लिए अधिक या बराबर 4), पिछले if बयान पूर्ववर्ती से स्वतंत्र बनाने के लिए पिछले else निकालें:

if (count == 2) { 
    document.write("hi"); 
} else if (count > 3) { 
    document.write("bye"); 
} 
if (count >= 4) { 
    document.write("lol"); 
} 
+0

@Doug - 'if (count> = 4)' अभिव्यक्ति इस संदर्भ में कभी भी सत्य का मूल्यांकन नहीं करेगी। यकीन नहीं है कि यह क्यों है। –

+0

@Doug: आखिरी 'else' इसे हटा दें। – Gumbo

+0

स्विच और यदि दोनों कथन में मूल्यांकन के क्रम में अभी भी समस्याएं हैं। नीचे मेरी टिप्पणी देखें: http://stackoverflow.com/questions/2312817/javascript-switch-with-logical-operators/3282442#3282442 –

0

आप अपने पिछले दो मामलों स्वैप चाहिए।

+0

यह – anthares

+0

क्यों काम करने के लिए पर्याप्त नहीं है? कृपया समझाईए। – Strawberry

+0

@ anthares: इसे काम करने के लिए पर्याप्त नहीं है, लेकिन यह एक बग है जो इसे जिस तरह से उम्मीद कर रहा है उससे काम करने से रोक देगा। – brian

1

आप गलत तरीके से केस क्लॉज का उपयोग करते हैं। आप एक मूल्य है कि स्विच खंड में मूल्य की तुलना में किया जाएगा प्रदान करना चाहिए ... और नहीं इस count>2

इस मामले में इस बूलियन अभिव्यक्ति सही या गलत का कच्चा हो जाएगा (1 या 0) की तरह एक बूलियन अभिव्यक्ति और आपकी मूल्य गणना की तुलना में और कभी-कभी काम कर सकता है, कभी-कभी - नहीं।

आपको इसे बयान के साथ बदलने पर विचार करना चाहिए।

0

switch सामान्य रूप से एक तय हालत/मूल्य की जरूरत है; क्योंकि आपके count हर बार परिवर्तनीय परिवर्तन होते हैं, यह इसके खिलाफ जाता है। इसके बजाय if-else स्थिति का उपयोग करें।

3

यह Gumbo's answer में एक सुधार है। मैं केवल एक अलग उत्तर लिख रहा हूं क्योंकि यह एक टिप्पणी के रूप में फिट नहीं होगा।

संपादित करें: Gumbo एक टिप्पणी है कि मैं डौग इरादा पढ़ने में भूलना हो सकता है में सुझाव दिया।यदि ओपी वास्तव में गिनती> = 4 के लिए "अलविदा" और "lol" दोनों मुद्रित करना चाहता है, तो हमें switch से break को निकालना होगा। ताकि "अलविदा" और "lol" इसी क्रम में मुद्रित कर रहे हैं मामलों, अब मूल ठीक हो गई हैं (जो जाहिरा तौर पर ओपी की मंशा है।)

switch (true) { 
    case (count == 2): 
     document.write("hi"); 
     break; 
    case (count > 3): 
     document.write("bye"); 
     // No break here; just fall through. 
    case (count >= 4): 
     document.write("lol"); 
     break; 
} 

इस मामले में, मैं Gumbo साथ सहमत हैं कि संशोधित if कथन सही है।

मूल जवाब इस प्रकार है (मानता है कि ओपी वास्तव में चाहता था या तो "lol" या "अलविदा" मुद्रित करने के लिए, लेकिन दोनों नहीं।)

switch बयान है कि Gumbo wrote लिए काम नहीं करेगा गिनती> = 4, इसी कारण से गम्बो का मूल if कथन काम नहीं करेगा: क्योंकि मामलों का अनुक्रम में मूल्यांकन किया जाता है, गणना> = 4 का तात्पर्य है कि दूसरा मामला (गिनती> 3) निष्पादित किया जाएगा; इसलिए स्क्रिप्ट गिनती> = 4. इसे ठीक करने के लिए परीक्षण तक पहुँचने कभी नहीं होगा, परीक्षण उच्चतम से न्यूनतम, उलटे क्रम में निष्पादित किया जाना चाहिए:

switch (true) { 
    case (count >= 4): 
     document.write("lol"); 
     break; 
    case (count > 3): 
     document.write("bye"); 
     break; 
    case (count == 2): 
     document.write("hi"); 
     break; 
} 

को सही if बयान अभी भी सही या तो नहीं है, क्योंकि गिनती के लिए> = 4 यह आउटपुट पर दोनोंbye और lol का उत्पादन करेगा। फिर, if सीढ़ी के भीतर परीक्षण उच्चतम से न्यूनतम मूल्यों पर जाने के लिए व्यवस्थित किया जाना चाहिए:

if (count >= 4) { 
    document.write("lol"); 
} else if (count > 3) { 
    document.write("bye"); 
} else if (count == 2) { 
    document.write("hi"); 
} 

यह आदर्श उदाहरण नहीं है, क्योंकि count एक पूर्णांक है अगर है, तो count >= 4 और count > 3 का मूल्यांकन एक ही उत्पादन करेगा परिणाम - true गिनती के लिए> = 4, false अन्यथा। यह मामला नहीं होगा यदि count एक फ़्लोटिंग-पॉइंट मान है (लेकिन फिर, "गिनती" नामक एक फ़्लोटिंग-पॉइंट मान अन्य चिंताओं को उठाएगा।)

+0

डौग ने सटीक विवरण नहीं दिया कि वह किस परिणाम के लिए अपेक्षित था ("प्रिंटिंग अलविदा और लॉल" एक सटीक वर्णन नहीं है)। यही कारण है कि मैंने अभी एक काम करने वाला 'स्विच' उदाहरण लिखा है और इसके बराबर 'if'-'else' उदाहरण लिखा है। – Gumbo

+0

आप जानते हैं, मुझे याद आया: हम सभी मामले खंड में एक ब्रेक शामिल करने के लिए बहुत कठिन हैं; यह मेरे लिए नहीं हुआ कि ओपी * चाहता है * दोनों मामलों को निष्पादित करने के लिए। मैं उस परिदृश्य को कवर करने के लिए अपना उत्तर अपडेट करने जा रहा हूं। –

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