今天,当插件BoxScroll被更改时,因为if中有两个以上的条件,我立即想到重写开关。更改进行到一半,突然想起JSHint等代码质量检查工具中的一个要求,用===替换===,没有不可靠的强制转换。然后我突然怀疑换成switch会不会降低效率。实际判断是在switch==还是===?
当你有想法的时候,赶紧养一个栗子,一口吃掉:
var a=' 5switch(a){ case 5: console . log('==');打破;case ' 5 ' : console . log('===');打破;Default:}最后一个控制台显示===,使用起来似乎很安全。查之前的学习笔记,嗯,高三确实说过开关判断是全等算子,所以不会发生类型转换。这里是一个总结
1.if和switch
如果是最常用的,那么就没有太多可说的了。值得注意的是,if非常类似于| |。if (conditionA){} else {}中的If conditionA为true,它甚至不会在else之前执行代码块后查看else内部的代码。就像当前面的| |为真时,后面的会被忽略,即使里面有更多的错误。基于这个性质,当然要把可能用得最多的代码块放在前面,这样可以减少判断的次数。另一方面,如果有很多if判断,并且可能执行的次数是均匀分布的,那么后面的判断语句每次都必须逐个执行前面的判断,不利于优化。最好将一层判断语句改为两层判断语句,如
if(A0A=1){//做点别的} if(A1A=2){ } else if(A2A=3){ } else if(A3A=4){ } else if(A4A=5){ } else if(A5A=6){ }
If(A0A=4){ If(A=1){//做点什么} else If(A1A=2){ } else If(A2 A=3){ } else If(A3A=4){ } } else If(A4A=8){//}我突然觉得这个方法有点像嵌套循环。将它放在外面,减少循环,有助于优化性能。如何把它分成两层甚至更多层,要看具体情况。
Switch是if最亲密的战友,每次if都忙得不可开交。switch和if之间的相互转换没什么好说的,switch和if一样,是从上到下依次判断的,不同的是,if中的else在switch中不起作用,它有自己的小弟:break。如果没有遇到中断,开关将继续执行,如所示
var a=2;switch(a){ case 1: console . log(' 1 ');//break miss case 2: console . log(' 2 ');case : console . log(' 3 ');default: console.log('无中断');}最后控制台显示2,3,无间断。其实挺好理解的。break是提示程序跳出内部执行体,转到下一个案件判决。如果不存在,就相当于if(条件){A}{B}。没有其他,a和b都必须被执行。还有两个小技巧,一个是任何表达式都可以写成switch和case,比如
开关(A B) {案例A * B : console . log(' 1 ');打破;案例a/b c:中断;//.default: console.log('无中断');}实际比较是(A B)===(a*b)和(A B)===(a/b c)。第二,开关有一个特殊的用法,比如
switch(true){ case condition 1://做某事breakcase条件break//.default: //.}此时,开关中的每一种情况都会被依次判断和执行。至于开关(假的)?鸡蛋没有用。
2.==和===
总之,全等和不全等运算符与等和不等运算符没有什么区别,只是在比较之前没有转换操作数。
最经典的案例
var a='5 ',b=5;a==b//truea===b//falsvar a=' ABC ',b=' AB ' ' CA===b //true。之所以在下面显示true,其实是和字符串类型的不变性分不开的。表面上看,B只是一个字符串,但实际上它与原来的B无关,每个字符串都存在于内存池中的特定位置。当执行b='AB' 'C '时,字符串AB和C已经销毁,b指向内存池中ABC的位置。因为指向前在内存池中找到了字符串ABC(因为A引用了它,所以它存在),所以B指向和A相同的区域,同余判断相等。如果B之前没有指向字符串ABC的变量,那么内存池中就没有变量,所以它会为ABC画一个位置,将B指向ABC。
附在前面的汇总表是两个:
以上就是本文的全部内容,希望大家喜欢。