2015-09-03 36 views
1

我有以下代碼片段。JavaScript開關奇怪的行爲

var caseObj = function() { 

} 

switch (typeof caseObj) { 

    case "function": 
     console.log("it is function"); 

    case "object": 

     console.log("It is object now"); 
} 

它的輸出是

it is function. 
It is object now. 

typeof caseObj使輸出function但它仍然演算值爲 情況下, 「對象」情況下也。

怎麼可能?我做錯了anythig?

編輯:

typeof caseObj是給function,所以執行這種情況下,但它也 執行object case.Why這種奇怪的行爲?

+0

在陳述之間使用中斷 –

+0

也許相關:http:// sta ckoverflow.com/questions/188461/switch-statement-fallthrough-should-it-be-allowed – C5H8NNaO4

+0

忘了剎車(休息)? :p – Gogol

回答

6

問題不在於typeof,但您已經錯過了案例中的break聲明。這將使casefunction OR object並執行這兩種情況下的塊。

您錯過了casebreak;聲明。這是在接下來的case中掉落的原因。

break語句終止當前循環,開關或標籤語句,並將程序控制權轉交給終止語句後面的語句。

var caseObj = function() { 
 

 
} 
 

 
switch (typeof caseObj) { 
 

 
    case "function": 
 
    document.write("it is function"); 
 
    break; 
 

 
    case "object": 
 

 
    document.write("It is object now"); 
 
    break; 
 
}

從答案的評論:

但是,如果沒有打破它也倒下,如果沒有來自switch.But匹配的情況下,退出其執行情況「對象」:陳述。爲什麼?

MDN

如果發現匹配,程序執行相關的語句。如果多個案例匹配提供的值,則匹配的第一個案例被選中,即使案例不相等。

與每個案例標籤關聯的可選break語句確保一旦匹配的語句被執行並且在switch語句後繼續執行,程序就會脫離switch。如果省略break,程序將繼續執行switch語句中的下一個語句。

+0

爲什麼需要休息? typeof caseObj是「函數」而不是「對象」。爲什麼它也在評估最後一種情況? –

+0

@RIYAJKHAN'break'允許控制出'開關' – Tushar

+0

沒有中斷它將繼續評估條件後的特殊情況。 –

2

switch執行始於第一case匹配請求的值,從頂部開始。

然後,除非您在某個地方使用break,否則它將繼續執行所有case s,從第一個匹配到底部。作爲一個例子,如果你在你的例子中反轉你的2 case,它只會輸出「它是函數」。

0

您沒有以每個個案子句結尾的突破語句。當你這樣做時,控制流程將傳遞給下一個條款條款的陳述,而不是條件條件不滿足。例如,如果您有:

var x = 1; 
switch(x) { 
    case 0: console.log(0); 
    case 1: console.log(1); 
    case 2: console.log(2); 
    case 3: console.log(2); 
} 

輸出將是:

1 
2 
3 

,但如果你把斷在每種情況下

var x = 1; 
switch(x) { 
    case 0: console.log(0);break; 
    case 1: console.log(1);break; 
    case 2: console.log(2);break; 
    case 3: console.log(2);break; 
} 

輸出將只是