JavaScript切换奇怪行为

时间:2015-09-03 07:10:28

标签: javascript function switch-statement

我有以下代码段。

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,但它仍然可以评估 案例"对象" 案例也是。

怎么可能?我做错了吗?

编辑:

typeof caseObj正在给function,所以它执行该案例但也是如此  执行object案例。为什么这种奇怪的行为?

3 个答案:

答案 0 :(得分:6)

问题不在typeof,但您错过了案例中的break声明。这会使case类似 function OR object 并执行两种情况的阻止。

您错过了case的{​​{3}}声明。这就是下一个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退出,它也会没有中断。但它执行案例“object”:statment也是。为什么?

来自break;

  

如果找到匹配项,程序将执行关联的语句。如果多个案例与提供的值匹配,则选择匹配的第一个案例,即使案例彼此不相等。

     

与每个案例标签关联的可选break语句确保一旦执行匹配语句,程序就会突破switch,并在switch后的语句处继续执行。如果省略break,程序将继续执行switch语句中的下一个语句。

答案 1 :(得分:2)

switch执行从第一个匹配请求值的case开始,从顶部开始。

然后,除非你在某处使用break,否则它将继续执行与匹配到底部的第一个case的所有case

例如,如果您在示例中反转了2 NSNotificatonCenter,它将仅输出"它是函数"。

答案 2 :(得分:0)

你没有结束每个 case 子句的break语句。执行此操作时,控制流将传递到下一个 case 子句的语句,而不管 case 条件是否满足。例如,如果你有:

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;
}

但是如果你在每种情况下放置休息

Resharper

输出只是 1