javascript中if和switch,==和===详解


Posted in Javascript onJuly 30, 2015

今天改插件BoxScroll的时候,因为if里面的条件判断多于两个,于是立马想着改写switch。改到一半,忽然记起来JSHint等代码质量检测工具中的一个要求,用===替换==,不用不可靠的强制转型。然后忽然猜想,改成switch是不是会降低效率啊?switch里面的实际判断是==还是===?

有了想法,赶紧举个栗子,好一口吃掉:

var a = '5';
switch (a) {
  case 5:
    console.log('==');
    break;
  case "5":
    console.log('===');
    break;
  default:
}

最后控制台显示的是===,看来可以放心的用。找了下以前的学习笔记,嗯,高三里面确实也说switch判断是全等运算符,因此不会发生类型转换。这里小结一下

1.if和switch

if 是用得最多的,没什么太多好说。值得注意的一点是:if 其实和 || 很像,如果if (conditionA){} else {} 中的conditionA为true,然后它执行完else之前的代码块后就看都不会看else里面的代码。和 || 前面为true的时候后面会被忽略一样,即便里面有再多的错误。基于这个性质,当然把可能用得最多的代码块放在前面,减少判断次数。另一方面,如果有很多的 if 判断,而且可能执行的次数分布比较均匀,那么后面的判断语句每次都要把前面的判断一个一个执行完,不利于优化。比较好的做法是将一层判断语句变成两层判断语句,如

if (a > 0 && a <= 1) {
  //do something
} else if (a > 1 && a <= 2) {

} else if (a > 2 && a <= 3) {

} else if (a > 3 && a <= 4) {

} else if (a > 4 && a <= 5) {

} else if (a > 5 && a <= 6) {

}...

变为

if (a > 0 && a <= 4) {
  if (a <= 1) {
    //do something
  } else if (a > 1 && a <= 2) {

  } else if (a > 2 && a <= 3) {

  } else if (a > 3 && a <= 4) {

  }
} else if (a > 4 && a <= 8) {
  //
}..

虽然前面的每个判断都多加了一次,但是后面的判断就都减少了(4-1)*n次,还是满赚的。忽然觉得这种方式和嵌套循环有点像,循环次数少的放在外面有助于性能优化,如何分成两层甚至多层就要看具体情况了。

switch是 if 最亲密的战友,每次 if 忙不过来的时候就过来搭把手。switch和 if 互转估计没什么好说的,而且switch和if一样,都是顺序从上往下执行判断的,有所不同的是 if 中的else在switch里面可不管用,它有自己的小弟:break。如果没有遇到break,switch会继续往下执行,如

var a = 2;
switch (a) {
  case 1:
    console.log("1");
    //break miss
  case 2:
    console.log("2");
  case 3:
    console.log("3");
  default:
    console.log('no break');
}

最后控制台显示 2,3,no break 。其实也蛮好理解,break是提示程序跳出内部执行体到下一个case 判断,如果没有了,相当于 if(condition){A}{B},没有了else,A和B当然都要执行啦。还有两个小tip,一是switch和case中可以写任何表达式,如

switch (A + B) {
  case a * b:
    console.log("1");
    break;
  case a / b + c:
    break;
    //...
  default:
    console.log('no break');
}

实际上的比较是 (A+B)===(a*b)和(A+B)===(a/b+c)。二是switch有一种特殊的用法,如

switch (true) {
  case condition1:
    //do something
    break;
  case condition2:
    break;
    //...
  default:
    //..
    ;
}

此时switch中的每一个case都会按照顺序判断执行。至于switch(false)?并没有什么卵用。

2.==与===

一句话搞定,除了在比较之前不转换操作数之外,全等和不全等操作符与相等和不相等操作符并没有什么不同。

最经典的案例

var a = "5",
  b = 5;
a == b     //true
a === b     //false
var a = "ABC",
  b = "AB" + "C";
a === b     //true

下面的显示true的原因其实和string类型不可变是分不开的。表面看上去b只是简单的拼接一个字符串,但实际上它已经和原来的b没有关系。每一个字符串都存在内存池中特定的地方,当b="AB"+"C"执行完的时候,字符串AB和C就已经被销毁,而b指向内存池中ABC的位置。由于在指向前在内存池中发现了字符串ABC(因为a引用着它,所以存在),所以b就和a指向同一块区域,全等判断相等。如果在b之前没有任何变量指向字符串ABC,那么内存池中没有,就会在里面划一块地方给ABC,并将b指向ABC。

附以前的总结图两张:

javascript中if和switch,==和===详解

javascript中if和switch,==和===详解

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
用js做一个小游戏平台 (一)
Dec 29 Javascript
JS getStyle获取最终样式函数代码
Apr 01 Javascript
jquery控制listbox中项的移动并排序的实现代码
Sep 28 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
Feb 26 Javascript
ie中js创建checkbox默认选中问题探讨
Oct 21 Javascript
javascript简单实现图片预加载
Dec 03 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
Jun 07 Javascript
JQuery DIV 动态隐藏和显示的方法
Jun 23 Javascript
jQuery基础_入门必看知识点
Jul 04 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
Jan 10 Javascript
JavaScript基于SVG的图片切换效果实例代码
Dec 15 Javascript
JS前端canvas交互实现拖拽旋转及缩放示例
Aug 05 Javascript
用javascript实现自动输出网页文本
Jul 30 #Javascript
理解javascript中的原型和原型链
Jul 30 #Javascript
原生js与jQuery实现简单的tab切换特效对比
Jul 30 #Javascript
文字垂直滚动之javascript代码
Jul 29 #Javascript
如何使用jQuery技术开发ios风格的页面导航菜单
Jul 29 #Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 #Javascript
详解JavaScript的Polymer框架中的通知交互
Jul 29 #Javascript
You might like
php at(@)符号的用法简介
2009/07/11 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
ThinkPHP模板输出display用法分析
2014/11/26 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
js调用图片隐藏&amp;显示实现代码
2013/09/13 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
vue实现路由监听和参数监听
2019/10/29 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
浅析Python四种数据类型
2018/09/26 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
python 自动识别并连接串口的实现
2021/01/19 Python
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
SQL数据库笔试题
2016/03/08 面试题
电气个人求职信范文
2014/02/04 职场文书
汽车促销活动方案
2014/03/31 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
Python的三个重要函数详解
2022/01/18 Python
全新239军机修复记
2022/04/05 无线电