2016-06-23 9 views
6

मैं 3 संस्करण के p.78 में 'वेब डेवलपर्स के लिए व्यावसायिक जावास्क्रिप्ट' निकोलस Zakas द्वारा में पढ़ें:स्विच बयान और प्रकार बलात्कार

स्विच बयान हूबहू का उपयोग कर मूल्यों तुलना बराबर ऑपरेटर, इसलिए कोई प्रकार बलात्कार होता है (उदाहरण के लिए स्ट्रिंग "10" संख्या 10 के बराबर नहीं है)।

मैं सिर्फ इस बात की पुष्टि के लिए कुछ सरल स्विच बयान बना और परिणाम अलग था:

var num = "9"; 

switch (true) { 
    case num < 0: 
     alert("less than 0"); 
     break; 

    case num >= 0 && num <10: 
     alert("between 0 and 10"); 
     break; 

    default: 
     alert("False"); 

} 

https://jsfiddle.net/pbxyvjyf/

तो, प्रकार बलात्कार किया जाता है: alert("between 0 and 10") चुना जाता है। क्या नियम बदल गए हैं या क्या मैं कुछ गलत कर रहा हूं?

उत्तर

6

हो जाएगा ताकि करना होगा वापसी false:

var num = "9"; 

switch (num) { 
    case num < 0: 
    alert("less than 0"); 
    break; 

    case num >= 0 && num <10: 
    alert("between 0 and 10"); 
    break; 

    default: 
    alert("False"); 

} 

इसलिए, लेखक सही है।

+1

धन्यवाद :) अब मैं समझता हूं कि मैं क्या गलत कर रहा था। वास्तव में, यहां तक ​​कि उदाहरण में मैंने लेखक को सही भी दिया था: \t'case num> = 0 && num <10: '(मेरा उदाहरण) संख्या एक स्ट्रिंग है, इसलिए 0 में परिवर्तित होती है क्योंकि गलत है और फिर' अलर्ट ("0 और 10 के बीच"); ' प्रकट होता है। धन्यवाद! – viery365

+2

समस्या यह है कि आप अनिवार्य रूप से 'सत्य' और 'झूठी' के साथ '9" 'की तुलना कर रहे हैं। अभिव्यक्ति ('num < 0', 'num > = 0 && num <10') का मूल्यांकन केस तुलना से पहले किया जाता है। –

+0

@ माइकसी बिल्कुल ठीक है आप कैसे कहते हैं! अब मुझे समझ आई। मुझे यह समझने के लिए धन्यवाद कि मैंने क्या किया है। – viery365

8

अपने मामले बयान एक बूलियन लौट इतना प्रकार सही है

num >= 0 && num <10 - रिटर्न सही या गलत

लेकिन अगर मैं इस

switch (1) { 
 
    case "1": 
 
     console.log("never get here"); 
 
     break; 
 

 
    case 1: 
 
     console.log("but this works"); 
 
     break; 
 

 
}

+0

बहुत बहुत धन्यवाद! मुझे यकीन था कि मैं कुछ गलत कर रहा था और मुझे खुशी है कि आपने मुझे सही किया है। – viery365

+0

कोई समस्या नहीं, खुशी मैं मदद कर सकता हूं :) – WalksAway

3
के रूप में इरादा

आप वास्तव में स्विच कथन का उपयोग नहीं कर रहे हैं। एक अभिव्यक्ति होनी चाहिए जिसका स्विच में मूल्यांकन किया गया हो और मामले संभावित मूल्यों की जांच करें। यह कैननिकल उदाहरणों में से एक है:

switch (new Date().getDay()) { 
    case 0: 
        day = "Sunday"; 
        break; 
    case 1: 
        day = "Monday"; 
        break; 
    case 2: 
        day = "Tuesday"; 
        break; 
    case 3: 
        day = "Wednesday"; 
        break; 
    case 4: 
        day = "Thursday"; 
        break; 
    case 5: 
        day = "Friday"; 
        break; 
    case 6: 
        day = "Saturday"; 
} 

आप स्विच स्टेटमेंट का उपयोग आईएफएस के समूह की तरह अधिक कर रहे हैं।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद! – viery365

3

प्रलेखन से यह पंक्ति क्या है कि case मानों में से प्रत्येक को switch मान की तुलना करने में कोई प्रकार का दबाव नहीं होता है।

यदि case अभिव्यक्ति स्वयं एक अभिव्यक्ति है जिसमें टाइप जबरन शामिल होगा, तो स्पष्ट रूप से प्रकार का जबरदस्त होना होगा। num >= 0 && num <10true का मूल्यांकन करता है, लेकिन कथन के शीर्ष पर true के विरुद्ध true की तुलना में इंजन "समान रूप से बराबर ऑपरेटर" का उपयोग करेगा। चूंकि true हूबहू true के बराबर है, नियंत्रण प्रवाह कि case में चला जाता है।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद! अब मैं समझता हूं और मैं फिर भी वही गलती नहीं करूँगा :) – viery365

1
नहीं

जावास्क्रिप्ट के एक विशेषज्ञ लेकिन मुझे लगता है कि नियम यह है कि लेखक का उल्लेख किया कि इस मामले में मान्य है, उदाहरण के लिए:

var num = "9"; 

    switch(num){ 

     case 9: 
      alert("Yes the number is equal to: 9"); 
      break; 
     default: 
      alert("False"); 

    } 

आप इस कोड को चलाने के लिए प्रयास करते हैं तो आप देखेंगे कि दूसरे अलर्ट होगा दिखाई देते हैं।

आशा है कि मैं आप की मदद की ..:)

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