2010-12-16 16 views
9

मुझे किसी और के जावास्क्रिप्ट कोड में एक बुलियन स्विच स्टेटमेंट का सामना करना पड़ा। यह इस तरह थोड़ा सा देखा:जावास्क्रिप्ट में बूलियन स्विच स्टेटमेंट का उद्देश्य क्या है?

switch (a || b) { 
    case true: 
    // do some stuff 
    break; 
    default: 
    // do other stuff 
    break; 
} 

मैं बहुत लंबे समय से प्रोग्रामिंग नहीं कर रहा हूं, लेकिन मैंने निश्चित रूप से पहले कभी ऐसा कुछ नहीं देखा है। यह बेवकूफ लगता है, लेकिन मैं प्रोग्रामर को संदेह का लाभ देना चाहता हूं। वहाँ ऊपर कोड और निम्नलिखित के बीच किसी भी कार्यात्मक अंतर है:

if (a || b) { 
    // do some stuff 
} 
else { 
    // do other stuff 
} 

और अगर वहाँ है, यह क्या है?

उत्तर

8

हां, एक अंतर है।खाते में अपने उदाहरण लें तो

var a = 0, 
    b = 1; 

अब switch बयान पर ध्यान दें:

switch (a || b) { 

जब इस स्विच का बयान चलाया जाता है, अभिव्यक्ति a || b मूल्यांकन किया जाता है। || एक शॉर्ट-सर्किट ऑपरेटर है, यदि यह "सच्चाई" है तो यह बाएं ऑपरेंड के मूल्य को वापस कर देगा, अन्यथा यह सही ऑपरेंड के मूल्य को वापस कर देगा। इस मामले में, a = 0, इसलिए b वापस कर दिया जाएगा (1)। अब case बयान को देखो:

case true: 

जब case बयानों का मूल्यांकन, कोई प्रकार बलात्कार या तो मूल्य पर किया जाता है और सख्त समानता माना जाता है। हमारे उदाहरण में, यह 1 === true लिखने जैसा ही है, इसलिए case कथन के बाद कोड कभी नहीं चलाया जाता है। तो चलो if बयान पर एक नज़र डालें:

if (a || b) { 

एक if बयान के लिए, सशर्त अभिव्यक्ति a || bमूल्यांकन किया जाता है और उसके बाद परिणाम एक बूलियन में बदल जाती है। आंतरिक रूप से, यह ToBoolean(a || b) जैसा दिखता है। चूंकि a || b1 का मूल्यांकन करता है और 1 का एक बूलियन में true है, तो स्थिति गुजरती है और ब्लॉक निष्पादित होता है।

एक बेहतर बराबर होगा:

if ((a || b) === true) { 
    // do some stuff 
} 
else { 
    // do other stuff 
} 

जैसा कि पहले ही ने कहा, स्थितियों में, जहां कई मामलों और प्रकार भिन्न हो सकता है देखते हैं, एक switch बयान उपयोगी हो सकता है। हालांकि, ऐसी स्थिति दुर्लभ होगी।

+0

वाह, धन्यवाद। यह आकर्षक है। – thismax

+0

@thismax: एनपी, खुश मैं मदद कर सकता था :-) –

1

एंडी टिप्पणी के बाद अपडेट किया गया और कोई अंतर (अपने उदाहरण में) है का जवाब है, लेकिन अपने उदाहरण में, if ब्लॉक अधिक पठनीय है और (मेरी राय में) है कि मामले में और अधिक समझ में आता है।

switch एक बयान है कि एक boolean का मूल्यांकन पर ing गलत लगता है सिर्फ इसलिए कि वहाँ हमेशा केवल दो मामलों ( true और false) हो जाएगा, और इस कारण के लिए मैं if ब्लॉक बजाय सलाह देते हैं।

switch(fruitType) { 
    case 'Apple': 
    // Apple Code 
    break; 
    case 'Orange': 
    // Orange Code 
    break; 
    // etc... 
    default: // other fruit 
    break; 
} 

आशा है कि मदद करता है:

switch जब आप एक चर कई मान हो सकता है कि मूल्यांकन कर रहे हैं और अधिक समझ में आता है!

+2

एक अंतर है। '|| 'एक शॉर्ट-सर्किट ऑपरेटर है, यह जरूरी नहीं है कि वह बूलियन लौटाए। उदाहरण के लिए '0 || 1' '1' वापस करेगा, और केस स्टेटमेंट सख्त समानता पर काम करते हैं। –

+1

@ एंडी: अच्छा बिंदु, स्पष्टीकरण के लिए धन्यवाद। –

2

स्पष्ट है इस मामले अपमानजनक लग रहा है, लेकिन जब से जावास्क्रिप्ट दृढ़ता से सिद्धांत में टाइप नहीं कर रहा है यह है जहाँ आप इनपुट नियंत्रित नहीं कर सकते मूल्यवान हो सकते हैं:

switch (foo) 
{ 
    case true: 
     // whatever 
     break; 
    case false: 
     // whatever 
     break; 
    default: 
     // FOO IS NOT A BOOLEAN, DO SOMETHING ELSE! 
     break; 
} 

साथ ही एंड्रयू मिश्रित केस। यह एक साधारण से थोड़ा सुरक्षित है/अन्य, और कुछ प्रकार की बूलियन जांच और फिर एक/अन्य के मुकाबले अधिक संक्षिप्त है।

+0

स्मार्ट! मुझे वह पसंद है। – thismax

+0

एंडी ई के मामलों पर मजबूती की कमी के कारण काम करता है क्योंकि अधिक स्पष्ट रूप से स्पष्ट किया गया है। – annakata

0

आपके उदाहरण में, कोई अंतर नहीं है। लेकिन a और b कैसे परिभाषित किया गया है पर निर्भर करता है, आप और अधिक स्विच बयान पर बाद में जोड़ सकते हैं, f.ex:

var a = false, b = null; 
switch (a || b) { 
    case true: 
    // do some stuff 
    break; 
    case null: 
    // do some stuff 
    break; 
    default: 
    // do other stuff 
    break; 
} 

उसके अलावा, यह ज्यादातर वरीयता कोडिंग की बात है।

0

आपका उदाहरण यह नहीं दिखाता है, लेकिन मुझे लगता है कि यदि आप स्थिति के आधार पर पहले case में गिरावट (यानी कोई ब्रेक नहीं) का उपयोग करना चाहते हैं तो यह अधिक संक्षिप्त कोड के लिए बना सकता है।

यह एक सभ्य निर्माण भी हो सकता है यदि आप किसी ऐसे तरीके से कार्यान्वित कर रहे हैं जो संभावित परिवर्तनों की अपेक्षा करता है और न्यूनतम पुनर्विक्रय करना चाहता है (उदाहरण के लिए, चयन तर्क को फिर से शुरू करते समय क्रियाओं को समान रखना चाहते हैं)।

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