走进javascript——解开switch之谜
很早以前就觉得switch很怪异,或者说一直没太理解它,它怪异就怪异在非要给每个语句加上break;不然后面的语句就算不符合条件还是会执行,比如以下这段代码
var num = 2;
switch(num){
case 1:
console.log(1);
case 2:
console.log(2);
case 3:
console.log(3);
case 4:
console.log(4);
}
执行效果如下
明明只有2才符合条件,但3跟4也被执行了,然后查教程说要加上break,后来代码就成了下面这个样子
var num = 2;
switch(num){
case 1:
console.log(1);
break;
case 2:
console.log(2);
break;
case 3:
console.log(3);
break;
case 4:
console.log(4);
break;
}
写过若干个switch语句以后,心里不由产生一种情绪,switch太TM难用了,明明很简单,非要让人多写一个break;还不如用if来判断,不知道这是不是很多人都有的想法,反正在之前我是这么想的。
写的代码越多,就越觉得这太不对劲了,于是在想,如果每个语句都要写break;那么解析器直接帮忙写上就好了,可现实是,解析器并没有这么干。在某一个瞬间,产生了一个想法,这个switch肯定还有我所不知道的东西,于是带着这种心情在网上各种查,终于在某一个瞬间,找到了一丝曙光。
不知道你有没有一种感觉哈,写switch特别难用,当然这是有前提的,那就是你对switch不了解。说它难用不仅仅只是说每次要加break,在if中,我们判断某个值如果等于2或者3的时候,我们可以下面这样写
var num = 3;
if(num===2||num===3){
console.log(true);
}
但如果要你在switch中实现这样的一个功能,可能会令你无从下手。
以上都是瞎说——,因为switch是可以实现这些功能的,之所以我们会觉得不能实现是因为它的这种实现方式,太容易让人误解了,并且如果你不往那方面去想,很难发现它的用处。
下面是一个用switch实现的判断num=2或=3的例子
var num = 2;
switch(num){
case 1:
console.log(1);
break;
case 2:
case 3:
console.log(2 + "或" + 3);
break;
case 4:
console.log(4);
break;
}
输出如下
这个case是一个入口,当某个值相匹配时,就会去执行相应的代码块,并且如果没有加break的话,后面的值不管是否匹配都会被执行直到遇见break将跳出switch语句,而以上的这段代码就是利用的这一点,我们在这里并没有给2的值加break;因此当值等于2的时候,还会接着往下执行,但在3中有一个break,因此执行完3就会被跳出。如果值为3则直接执行3代码块,接着跳出。
也就是说,之前我所认为的怪异,它是合理的,只是这些东西,没有被我所发现。
如果想在switch中实现判断,诸如1>2,则可以使用下面的这种方式来实现
var num = 2;
switch(true){
case num>1:
console.log("num>1");
break;
case num<1:
console.log("num<1");
break;
}
在switch中做判断的时候,需要注意一点,它用的是全等=而非,比如下面这段代码
var num = "1";
switch(num){
case 1:
console.log(1);
break;
case 2:
console.log(2);
break;
}
它并没有输出1,因为在switch中默认使用的是全等,因此它不会进行隐式转换。
如果你想实现隐式转换,可以用下面这种方式来实现。
var num = "1";
switch(true){
case num==1:
console.log(1);
break;
case num==2:
console.log(2);
break;
}
输出如下
这个true究竟是个什么...,这是你的第一反应?
之所以会有这种感觉,是因为我们对switch一直都存在着一些误解,而且这种误解很深很深,反正我从学编程以来就一直没有理解这个switch,开始是它才过于基础,导致很多人都不愿意去研究它。
为了解开这个switch之谜,我从重对它做一次讲解,用代码来讲把。
switch(x){
case n:
.....
break;
}
其中的x代表某一个值,而case中的n如果和x一模一样则会被执行,注意是一模一样,举个例子
(x = 5) 5 (n = x==5) true 因为5!==true所以不会被执行
具体代码
var num = 5;
switch(num){
case num==5:
console.log(num);
break;
}
又如
var num = 5;
switch(num){
case true:
console.log(num);
break;
}
这里所说的一模一样就是说的,num这个值和case上的值要一样,不是单方面的case为true就为true。
而我们上面给switch传true就是因为这个原因,因为true是个布尔值,所以我们才可以用判断。
其实switch并没有限制你要传什么,它才不管你传的是false还是数组,你case上的值只要和它相对应就ok,最后举个例子
switch(undefined){
case [][0]:
console.log(undefined);
break;
}
输出undefined。
虽然这篇文章是在讲switch,但我觉得它同时也说明了一个道理.........自己去悟。
走进javascript——解开switch之谜的更多相关文章
- Javascript 中 switch case 等于 (== )还是 恒等于(===)?
Javascript 中 switch case 等于 (== )还是 恒等于(===)? 可以测试一下以下代码,这个 case 中是 等于(==)还是恒等于(===) <script> ...
- JavaScript中Switch使用
switch 语句用于基于不同的条件来执行不同的动作.使用 switch 语句来选择要执行的多个代码块之一. switch(n) { case 1: 执行代码块 1 break; case 2: 执行 ...
- javascript总结10:JavaScript的Switch语句
1 switch语句 的作用: switch 语句用于基于不同的条件来执行不同的动作. 每当满足一个变量条件,就会执行当前的case内容. break 关键字用于跳出switch代码块.会终止swit ...
- 雷哥带你走进Javascript
javascript复习笔记--------------------------------------------1.概念2.面向对象思想3.作用认识4.引入方式5.执行顺序 变量 1)声明方式 x ...
- javascript的switch的使用注意
如果是以下代码: <script> var t_keleyi_com = 65; switch (t_keleyi_com) { case '65': alert("字符串65. ...
- 走进javascript——DOM事件
DOM事件模型 在0级DOM事件模型中,它只是简单的执行你为它绑定的事件,比如你为某个元素添加了一个onclick事件,当事件触发时,它只是去调用我们绑定的那个方法,不再做其他的操作. 在2级DOM事 ...
- 走进javascript——不起眼的基础,值和分号
值 有时我很想知道javascript解析引擎是如何区分一个变量的值,比如下面这段代码. var x = 'javascript'; //javascript x = "hello" ...
- 初识Javascript.03 -- switch、自增、while循环、for、break、continue、数组、遍历数组、合并数组concat
除了注意大小写,别的木啥了 Switch语句 Switch(变量){ case 1: 如果变量和1的值相同,执行该处代码 break; case 2: 如果变量和2的值相同,执行该处代码 break; ...
- 走进javascript——类型
ECMAScript语言类型对应于使用ECMAScript语言的ECMAScript程序员直接操作的值.ECMAScript语言类型有以下几种Undefined,Null,Boolean,String ...
随机推荐
- webstrom 编码
设置文件保存格式: webstrom的右下角选择你需要的编码
- 今日头条视频Url嗅探
1.打开http://toutiao.com/a6309254755004875010/,查看网页源代码获取videoid = 0425d8f0c2bb425d9361c0eb2eeb4f16 2.拼 ...
- robotium从入门到放弃 三 基于apk的自动化测试
1.apk重签名 在做基于APK的自动化测试的过程中,需要确保的一点是,被测试的APK必须跟测试项目具有相同的签名,那怎么做才能确保两者拥有相同的签名呢?下面将给出具体的实现方法. 首先将被测 ...
- iOS 之 assign、retain、copy、nonatomic
1. assign 1.1. 普通赋值 一般用于基本类型 1.2. 常见委托设计模式 防止循环引用 2. retain 保留计数,获取了对象的所有权.引用计数在原有基础上加1. 3. copy 同re ...
- 第一部分 代码组织概念,集成开发环境(IDE)
代码组织概念 主要是代码文件,项目和解决方案. 解决方案(.sln)包含多个项目(.csproj),一个项目又包含多个文件(.cs). 集成开发环境(IDE): 由编辑.编译.调试,以及用户图形界面, ...
- 测试web网站兼容性的方法
随着操作系统,浏览器越来越多样性,导致软件兼容性测试在目前软件测试领域占有很重要的地位,无论是B/S架构还是C/S架构的软件都需要进行兼容性测试,为了充分保证产品的平台无关性,使用户充分感受到软件的友 ...
- doubango(3)--协议栈的启动过程
协议栈启动的上层接口 对于Doubango中得sip协议栈,是通过SipStack类粘合上层代码与底层代码的,该类定义在SipStack.h中,实现在SipStack.cxx中.当构造好一个SipSt ...
- 负载均衡软件LVS分析二(安装)
一. 安装LVS软件 1.安装前准备工作操作系统:统一采用Centos4.4版本.地址规划,如表1所示:表1 更详细的信息如图2所示: 图2 LVS DR模式安装部署结构图 图2中的VIP指的是虚 ...
- mac bash_profile
# This is the filename where your incoming mail arrives. MAIL=~/mbox MAILCHECK=30 HISTFILE=~/.histor ...
- tomact配置域名和端口直接访问网站
tomact配置域名和端口直接访问网站,就是使用域名解析到主机,通过端口执行网站地址,实现访问,在上一章节中发布了两个web项目,但是都是执行同一个根文件夹,通过 http://localhost:8 ...