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 相关文章推荐
IE事件对象(The Internet Explorer Event Object)
Jun 27 Javascript
jquery遍历select元素(实例讲解)
Dec 31 Javascript
JS 删除字符串最后一个字符的实现代码
Feb 20 Javascript
jquery实现文本框数量加减功能的例子分享
May 10 Javascript
js的各种排序算法实现(总结)
Jul 23 Javascript
浅谈js中对象的使用
Aug 11 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
Dec 13 Javascript
TypeScript入门-接口
Mar 30 Javascript
AngularJs 延时器、计时器实例代码
Sep 16 Javascript
浅谈Vuex的状态管理(全家桶)
Nov 04 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
Sep 25 Javascript
浅析JavaScript中的变量提升
Jun 01 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递归获取目录内所有文件的实现方法
2016/11/01 PHP
JS 自动完成 AutoComplete(Ajax 查询)
2009/07/07 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
React从react-router路由上做登陆验证控制的方法
2018/05/10 Javascript
微信小程序实现收藏与取消收藏切换图片功能
2018/08/03 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
vue路由教程之静态路由
2019/09/03 Javascript
python实现迭代法求方程组的根过程解析
2019/11/25 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
JS 5种遍历对象的方式
2020/06/16 Javascript
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
[07:31]DOTA2卡尔工作室 英雄介绍主宰篇
2013/06/25 DOTA
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
python GUI库图形界面开发之PyQt5开发环境配置与基础使用
2020/02/25 Python
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
计算机专业毕业生自荐信
2013/12/31 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
党委班子对照检查材料
2014/08/19 职场文书
私人房屋买卖协议书
2014/10/04 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
教师个人学习总结
2015/02/11 职场文书
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
Java 数据结构七大排序使用分析
2022/04/02 Java/Android