Switch表达式解析:
switch语句根据表达式的值,依次与case子句中的进行比较:
1.如果两者相等,则执行其后的语句段,当遇到break关键字时跳出整个switch语句。
2.如果不相等,则继续匹配下一个case。
3.switch语句包含一个可选的default关键字,如果在前面的case中没有找到相等
的条件,则执行default后面的语句段。
注意:这个相等在switch中执行的是全等(===)来与各个 cese 子句中的值进行匹配的。由于使用的是全等运算符,因此不会自动转换每个值的类型。 正式因为全等式 我们用起来需要格外小心
例子:
var b = 'alin';
switch (b) {
case 'alin1' || 'alin':
console.log('NaNNaN');
break;
default:
console.log(1);
}
我们可发现 上面代码运行结果 打印出来的是 1 而不是NaNNaN
是不是有人疑问了 为什么? 接下来看这个例子
// 例子一
// 例子一
if ('alin' === 'alin1' || 'alin') {
console.log('走这里面吗?')
}else {
console.lo('1')
}
if ('alin' === 'alin1' || 'alin' === 'alin') {
console.log('走这里面吗?')
}else {
console.log('1')
}
结果打印的都是 ‘走这里吗?’
我们发现两个结果出来的 都是相同的 走的是有 ||
语句条件中 同样是上述表达式 换个参数比较
// 例子二
// 例子二
if ( 0 === 'alin1' || 0 ) {
console.log('走这里面吗?')
}else {
console.log('1')
}
if ( 0 === 'alin1' || 0 === 0) {
console.log('走这里面吗? 例子2')
}else {
console.log('1 例子2')
}
结果一个打印 1 一个打印 走这里面吗? 例子2
结果发现了 两个运行结果不一样 由此我们可以从这俩个例子可以总结出
全等运算符优先级高,所以第一个表达式可以写为:( 0 === ‘alin1’) || 0
根据短路原则 当0 != ‘alin1’ 时 表达式求值就是 0
由此可见 我们的例子2 是当0 !== ‘alin’ 第一个判断就是if(0) 第二个表达式就是if (0 === 0) 所以结果给例子一的结果不一样
那又有人问了 这两个结果还是无法证明 上面switch语句为什么打印出来的是1 因为无论是case表达式解读为
b === 'alin1' || alin 还是 b===' alin1' || b ==='alin' 都无法打印出来1
其中b为参数且值为alin
那我们不妨大胆得出结论 case语句执行的表达式与以上的等式都不相等
其实是 b === ('alin1' || alin)
而括号先行原则 那判断语句始终是 b === 'alin1’作比较
即这就是为什么我们用switch要慎用甚至不用|| 运算符的原因
我们可以改写为:
var b = 'alin';
switch (b) {
case 'alin1' :
case 'alin' :
console.log('NaNNaN');
break;
default:
console.log(1);
}