जावास्क्रिप्ट में, ब्रेक का उपयोग करने से बेहतर अभ्यास माना जाने वाला स्विच स्टेटमेंट वापस आ रहा है?


199

विकल्प 1 - वापसी का उपयोग करके स्विच करें:

function myFunction(opt) 
{
    switch (opt) 
    {
        case 1: return "One";
        case 2: return "Two";
        case 3: return "Three";

        default: return "";
    }    
}

विकल्प 2 - ब्रेक का उपयोग करके स्विच करें:

function myFunction(opt) 
{
    var retVal = "";

    switch (opt) 
    {
        case 1: 
            retVal = "One";
            break;

        case 2: 
            retVal = "Two";
            break;

        case 3: 
            retVal = "Three";
            break;
    }

    return retVal;
}

मुझे पता है कि दोनों काम करते हैं, लेकिन एक सबसे अच्छा अभ्यास है? मैं विकल्प 1 को पसंद करता हूं - सबसे अच्छा रिटर्न का उपयोग करके स्विच करें, क्योंकि यह क्लीनर और सरल है।


यहाँ @ ic3b3rg की टिप्पणियों में उल्लिखित तकनीक का उपयोग करके मेरे विशिष्ट उदाहरण का jsFiddle है :

var SFAIC = {};

SFAIC.common = 
{
    masterPages: 
    {
        cs: "CS_",
        cp: "CP_"
    },

    contentPages: 
    {
        cs: "CSContent_",
        cp: "CPContent_"    
    }
};

function getElementPrefix(page) 
{
    return (page in SFAIC.common.masterPages)
        ? SFAIC.common.masterPages[page]
        : (page in SFAIC.common.contentPages)
            ? SFAIC.common.contentPages[page]
            : undefined;
}

फ़ंक्शन को कॉल करने के लिए, मैं निम्नलिखित तरीकों से ऐसा करूंगा:

getElementPrefix(SFAIC.common.masterPages.cs);
getElementPrefix(SFAIC.common.masterPages.cp);
getElementPrefix(SFAIC.common.contentPages.cs);
getElementPrefix(SFAIC.common.contentPages.cp);

यहां समस्या यह है कि यह हमेशा अपरिभाषित होकर लौटता है। मैं अनुमान लगा रहा हूं कि यह इसलिए है क्योंकि यह वस्तु शाब्दिक के वास्तविक मूल्य में गुजर रहा है और संपत्ति नहीं। मैं @ ic3b3rg की टिप्पणियों में वर्णित तकनीक का उपयोग करके इसे ठीक करने के लिए क्या करूंगा ?


4
+1 अच्छा सवाल। मैंने खुद को आश्चर्यचकित किया है, और जब मुझे पता है कि यह सिर्फ वापस आने के लिए काम करता है, तो मुझे नहीं पता कि क्या यह सबसे अच्छा अभ्यास है। यह देखने के लिए उत्सुक है कि समुदाय क्या सोचता है।
एली

जवाबों:


267

एक ब्रेक आपको फ़ंक्शन में प्रसंस्करण जारी रखने की अनुमति देगा। यदि आप कार्य करना चाहते हैं तो बस स्विच से बाहर लौटना ठीक है।


6
तो, मेरे प्रश्न में उदाहरण दिया गया है, इसका उत्तर हां है। लेकिन, अगर आपके पास कोई ऐसा फंक्शन है, जहां आपको जाने की जरूरत है, तो जाहिर तौर पर एक ब्रेक वह होगा जो आप इस्तेमाल करेंगे।
कोड मेवरिक

9
@ मर्क कोस्टेलो के जवाब ने मुझे आपके प्रश्न के बारे में थोड़ा और धन्यवाद दिया। मुझे लगता है कि आप एक सामान्य "सर्वोत्तम अभ्यास" दिशानिर्देश के लिए देख रहे हैं, लेकिन आपके द्वारा दिए गए विशिष्ट उदाहरण में, सबसे अच्छा अभ्यास है return {1:"One",2:"Two,3:"Three"}[opt];। यदि आपको डिफ़ॉल्ट की आवश्यकता है, तो यह होगाvar o={1:"One",2:"Two,3:"Three"}; return opt in o?o[opt]:"";
ic3b3rg

@ ic3b3rg - मैंने अपनी तकनीक का उपयोग करने की कोशिश करते हुए अपने विशिष्ट उदाहरण के साथ अपना प्रश्न संपादित किया है return (opt in o) ? o[opt] : "";, लेकिन यह हमेशा मेरे विशिष्ट मामले में डिफ़ॉल्ट लौटाता है।
कोड मेवरिक

मेरे कोड में एक टाइपो था (दूसरे "को याद करना "Two") लेकिन यह मेरे लिए काम करता है ... यहाँ एक सरल परीक्षण है:var o={1:"One",2:"Two",3:"Three"},opt=2; alert(opt in o?o[opt]:"");
ic3b3rg

मैं आपके उदाहरण का उपयोग नहीं कर रहा था, बस तकनीक। मेरे प्रश्न को देखो और मेरे jsField के लिंक पर क्लिक करके देखें कि मैं किस बारे में बात कर रहा हूं।
कोड मेवरिक

9

यह निर्भर करता है, यदि आपके फ़ंक्शन में केवल स्विच स्टेटमेंट शामिल है, तो मुझे लगता है कि इसका ठीक है। हालाँकि, यदि आप उस फ़ंक्शन के भीतर कोई अन्य कार्य करना चाहते हैं, तो शायद यह एक महान विचार नहीं है। आपको भविष्य में अभी बनाम अपनी आवश्यकताओं पर विचार करना पड़ सकता है। यदि आप अपने फ़ंक्शन को विकल्प एक से विकल्प दो में बदलना चाहते हैं, तो अधिक रीफैक्टरिंग की आवश्यकता होगी।

हालाँकि, यह देखते हुए कि अगर / अन्यथा बयानों में निम्नलिखित करना सबसे अच्छा अभ्यास है:

var foo = "bar";

if(foo == "bar") {
    return 0;
}
else {
    return 100;
}

इसके आधार पर, यह तर्क दिया जा सकता है कि विकल्प एक बेहतर अभ्यास है।

संक्षेप में, इसका कोई स्पष्ट उत्तर नहीं है, इसलिए जब तक आपका कोड एक सुसंगत, पठनीय, बनाए रखने योग्य मानक का पालन करता है - यह कहना है कि आपके आवेदन के दौरान एक और दो विकल्पों को मिलाएं और मेल न करें, यही वह सबसे अच्छा अभ्यास है जो आपको होना चाहिए निम्नलिखित।


2
उस उदाहरण में सबसे अच्छा अभ्यास हैreturn foo == "bar";
ic3b3rg

10
मैं माफी माँगता हूँ अगर मैं तुम्हें परेशान कर रहा हूँ, लेकिन उस मामले में मैं अभी भी आसान होगा: return foo == "bar" ? 0 : 100;या यहां तक ​​कि return [100,0][foo == "bar"];
ic3b3rg

4
@ ic3b3rg - ऐसा नहीं होना चाहिए return [100,0][+(foo == "bar")]; :?
कतार

3
@Queue आप सही हैं कि बूलियन को पूर्णांक में परिवर्तित किया जाना चाहिए, लेकिन मैं इसे इस तरह से return [100,0][foo == "bar" & 1];
करूंगा

7
@ ic3b3rg && Queue - इस तरह के ट्रिक्स का इस्तेमाल करके आप किसी को यूजर्स कोड कैसे बनाए रखना चाहेंगे? (इस तरह से सामान को गति-अनुकूलन करने के लिए
प्रीकम्पलर पर भरोसा करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.