2015-09-03 38 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; 
} 

输出将只是