解析Js Switch语句中 慎用或运算符 (||)的原因

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);
}
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值