我有以下代码段。
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
案例。为什么这种奇怪的行为?
答案 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