一、条件判断语句指的是根据指定的条件所返回的结果(真或假或其他预定义的),来执行特定的语句。
二、JavaScript支持两种条件判断语句:if…else和switch
if…else 语句
一、不建议在条件表达式中使用赋值语句,因为在快速查询代码时容易把它看成等值比较。
| 【示例】不要使用以下代码```javascript if (x = y) { / 语句 / }
|
| --- |
| 【示例】如果需要在条件表达式中使用赋值,通常在赋值语句前后额外添加一对括号```javascript
if ((x = y)) {
/* statements here */
}
| | —- |
错误的值
一、下面这些值将被计算出false:false、undefined、null、0、NaN、空字符串(””)。当传递给条件语句所有其他的值,包括所有对象会被计算为真。
二、不要混淆原始的布尔值true和false与Boolean对象的真和假。
| 【示例】```javascript var b = new Boolean(false) if (b) // true if (b == true) // false if (b == false) // true if (b === false) // false
|
| --- |
| 【示例】下面这段程序的显示结果为```javascript
var x = new Boolean(false);
if (x) {
alert('hi');
}
var y = Boolean(0);
if (y) {
alert('hello');
}
答案:hi
解析:考察点:条件判断语句的条件表达式、布尔类型的转换规则、布尔类型转换方式-显式转换
这里期望x是一个布尔类型的原始值,用new调用构造函数会新建一个布尔对象,任何对象转为布尔值,都得到true。
Boolean(0)是进行显示类型转换,0转布尔,结果为false |
| —- |
条件运算符 ‘?’
一、有时我们需要根据一个条件去赋值一个变量。“条件”或“问号”运算符让我们可以更简短地达到目的。
【见】运算符类型#条件运算符:https://www.yuque.com/tqpuuk/yrrefz/hz0koc
| 【示例】```javascript let accessAllowed; let age = prompt(‘How old are you?’, ‘’);
if (age > 18) { accessAllowed = true; } else { accessAllowed = false; }
alert(accessAllowed);
1、可用下面的代码实现上述示例```javascript
let accessAllowed = (age > 18) ? true : false
2、下面的代码同样可以实现```javascript let accessAllowed = age > 18;
|
| --- |
<a name="T6Oj9"></a>
## 多个 ‘?’
一、使用一系列问号?运算符可以返回一个取决于多个条件的值。<br />【示例1】
```javascript
let age = prompt('age?', 18);
let message = (age < 3) ? 'Hi, baby!' :
(age < 18) ? 'Hello!' :
(age < 100) ? 'Greetings!' :
'What an unusual age!';
alert( message );
1、可能很难一下子看出发生了什么。但经过仔细观察,我们可以看到它只是一个普通的检查序列。
(1)第一个问号检查age < 3。
(2)如果为真 — 返回’Hi, baby!’。否则,会继续执行冒号”:”后的表达式,检查age < 18。
(3)如果为真 — 返回’Hello!’。否则,会继续执行下一个冒号”:”后的表达式,检查age < 100。
(4)如果为真 — 返回’Greetings!’。否则,会继续执行最后一个冒号”:”后面的表达式,返回’What an unusual age!’。
2、这是使用if..else实现上面的逻辑的写法:
if (age < 3) {
message = 'Hi, baby!';
} else if (age < 18) {
message = 'Hello!';
} else if (age < 100) {
message = 'Greetings!';
} else {
message = 'What an unusual age!';
}
‘?’ 的非常规使用
一、有时可以使用问号?来代替if语句:
let company = prompt('Which company created JavaScript?', '');
(company == 'Netscape') ?
alert('Right!') : alert('Wrong.');
1、根据条件company ==’Netscape’,要么执行?后面的第一个表达式并显示对应内容,要么执行第二个表达式并显示对应内容。
2、在这里我们不是把结果赋值给变量。而是根据条件执行不同的代码。
二、不建议这样使用问号运算符。
1、这种写法比if语句更短,对一些程序员很有吸引力。但它的可读性差。
三、下面是使用if语句实现相同功能的代码,进行下比较:
let company = prompt('Which company created JavaScript?', '');
if (company == 'Netscape') {
alert('Right!');
} else {
alert('Wrong.');
}
1、因为我们的眼睛垂直扫描代码。所以,跨越几行的代码块比长而水平的代码更易于理解。
四、问号?的作用是根据条件返回一个或另一个值。请正确使用它。当需要执行不同的代码分支时,请使用if。
switch语句
一、switch语句允许一个程序求一个表达式的值并且尝试去匹配表达式的值到一个case标签。如果匹配成功,这个程序执行相关的语句。
二、
三、switch语句可以替代多个if判断。
四、switch语句为多分支选择的情况提供了一个更具描述性的方式。
语法
一、switch语句有至少一个case代码块和一个可选的default代码块。
二、switch语句
switch (expression) {
case label_1: // if (expression === label_1)
statements_1
[break;]
case label_2:
statements_2
[break;]
...
default:
statements_def
[break;]
}
1、如果break被忽略,程序将继续执行switch语句中的下一条语句。
【示例1】
let a = 2 + 2;
switch (a) {
case 3:
alert( 'Too small' );
break;
case 4:
alert( 'Exactly!' );
break;
case 5:
alert( 'Too large' );
break;
default:
alert( "I don't know such values" );
}
1、这里的switch从第一个case分支开始将a的值与case后的值进行比较,第一个case后的值为3匹配失败。
2、然后比较4。匹配,所以从case 4开始执行直到遇到最近的break。
3、如果没有break,程序将不经过任何检查就会继续执行下一个case。
【示例2】无break的例子:
let a = 2 + 2;
switch (a) {
case 3:
alert( 'Too small' );
case 4:
alert( 'Exactly!' );
case 5:
alert( 'Too big' );
default:
alert( "I don't know such values" );
}
1、在上面的例子中我们会看到连续执行的三个alert:
alert( ‘Exactly!’ );
alert( ‘Too big’ );
alert( “I don’t know such values” );
三、任何表达式都可以成为switch/case的参数
【示例1】switch和case都允许任意表达式。
let a = "1";
let b = 0;
switch (+a) {
case b + 1:
alert("this runs, because +a is 1, exactly equals b+1");
break;
default:
alert("this doesn't run");
}
1、这里+a返回1,这个值跟case中b + 1相比较,然后执行对应的代码。
| 【示例】执行以下程序段后,x的值是( )```javascript var x=0; switch(++x) { case 0: ++x; case 1: ++x; case 2: ++x; }
A. 1<br />B. 2<br />C. 3<br />D. 4<br />**答案**:C<br />**解析**:switch中,对x+1,此时x为1,然后进入case 1 中,又执行++x,此时x变为2;由于case 1中没有break,然后继续执行 case 2,执行++x,所以x变成3 |
| --- |
<a name="f8fWh"></a>
## “case” 分组
一、共享同一段代码的几个case分支可以被分为一组:<br />【示例1】如果我们想让case 3和case 5执行同样的代码:
```javascript
let a = 3;
switch (a) {
case 4:
alert('Right!');
break;
case 3: // (*) 下面这两个 case 被分在一组
case 5:
alert('Wrong!');
alert("Why don't you take a math class?");
break;
default:
alert('The result is strange. Really.');
}
1、现在3和5都显示相同的信息。
2、switch/case有通过 case 进行“分组”的能力,其实是 switch 语句没有break时的副作用。因为没有break,case 3会从(*)行执行到case 5。
类型很关键
一、这里的相等是严格相等。被比较的值必须是相同的类型才能进行匹配。
【示例1】
let arg = prompt("Enter a value?")
switch (arg) {
case '0':
case '1':
alert( 'One or zero' );
break;
case '2':
alert( 'Two' );
break;
case 3:
alert( 'Never executes!' );
break;
default:
alert( 'An unknown value' )
}
1、在prompt对话框输入0、1,第一个alert弹出。
2、输入2,第二个alert弹出。
3、但是输入3,因为prompt的结果是字符串类型的”3”,不严格相等===于数字类型的3,所以case 3不会执行!4、因此case 3部分是一段无效代码。所以会执行default分支。