[TOC]
JavaScript使用`if () { ... } else { ... }`來進行條件判斷。
# if語句

語法:
~~~javascript
if(/* 條件表達式 */){
// 執行語句
}
~~~
~~~
if(/* 條件表達式 */){
// 成立執行語句
}else{
// 否則執行語句
}
~~~
多條件選擇
~~~
if(/* 條件表達式1 */){
// 成立執行語句
}else if(/* 條件表達式2 */){
// 成立執行語句
}else if(/* 條件表達式3 */){
// 成立執行語句
}else{
// 否則執行語句
}
~~~
例如,根據年齡顯示不同內容,可以用`if`語句實現如下:
~~~
var age = 20;
if (age >= 18) { // 如果age >= 18為true,則執行if語句塊
alert('adult');
} else { // 否則執行else語句塊
alert('teenager');
}
~~~
其中`else`語句是可選的。如果語句塊只包含一條語句,那么可以省略`{}`:
~~~
var age = 20;
if (age >= 18)
alert('adult');
else
alert('teenager');
~~~
省略`{}`的危險之處在于,如果后來想添加一些語句,卻忘了寫`{}`,就改變了`if...else...`的語義,例如:
~~~
var age = 20;
if (age >= 18)
alert('adult');
else
console.log('age < 18'); // 添加一行日志
alert('teenager'); // <- 這行語句已經不在else的控制范圍了
~~~
上述代碼的`else`子句實際上只負責執行`console.log('age < 18');`,原有的`alert('teenager');`已經不屬于`if...else...`的控制范圍了,它每次都會執行。
相反地,有`{}`的語句就不會出錯:
~~~
var age = 20;
if (age >= 18) {
alert('adult');
} else {
console.log('age < 18');
alert('teenager');
}
~~~
這就是為什么我們建議永遠都要寫上`{}`。
## 多行條件判斷
如果還要更細致地判斷條件,可以使用多個`if...else...`的組合:
~~~
var age = 3;
if (age >= 18) {
alert('adult');
} else if (age >= 6) {
alert('teenager');
} else {
alert('kid');
}
~~~
上述多個`if...else...`的組合實際上相當于兩層`if...else...`:
~~~
var age = 3;
if (age >= 18) {
alert('adult');
} else {
if (age >= 6) {
alert('teenager');
} else {
alert('kid');
}
}
~~~
但是我們通常把`else if`連寫在一起,來增加可讀性。這里的`else`略掉了`{}`是沒有問題的,因為它只包含一個`if`語句。注意最后一個單獨的`else`不要略掉`{}`。
*請注意*,`if...else...`語句的執行特點是二選一,在多個`if...else...`語句中,如果某個條件成立,則后續就不再繼續判斷了。
試解釋為什么下面的代碼顯示的是`teenager`:
~~~
'use strict';
var age = 20;
if (age >= 6) {
alert('teenager');
} else if (age >= 18) {
alert('adult');
} else {
alert('kid');
}
~~~
由于`age`的值為`20`,它實際上同時滿足條件`age >= 6`和`age >= 18`,這說明條件判斷的順序非常重要。請修復后讓其顯示`adult`。
如果`if`的條件判斷語句結果不是`true`或`false`怎么辦?例如:
~~~
var s = '123';
if (s.length) { // 條件計算結果為3
//
}
~~~
> JavaScript把`null`、`undefined`、`0`、`NaN`和空字符串`''`視為`false`,其他值一概視為`true`,因此上述代碼條件判斷的結果是`true`。
## 案例分析
1. 求兩個數的最大數
~~~js
var num1 = 2;
var num2 = 5;
if(num1>num2){
console.log('較大數是:' + num1);
}
else{
console.log('較大數是:' + num2);
}
~~~
1. 判斷一個數是奇數還是偶數
~~~js
var num = 10;
if(num%2 === 0) {
console.log('偶數');
}
else{
console.log('奇數');
}
~~~
1. 分數轉換,把百分制轉換成ABCDE A(90-100) B(80-90) C(70-80) D(60-70) E(<60)
~~~js
var score = 80;
if(score >= 90) {
console.log('A');
}
else if(score >= 80){//隱藏條件 后邊的值都是<90
console.log('B');
}
else if(score >= 70){
console.log('C');
}
else if(score >= 60){
console.log('D');
}
else {
console.log('E');
}
~~~
# 三元運算符
> 分支結構的另類寫法
> 帶有 三個 操作數的運算符
> 表達式1? 表達式2 : 表達式3;
> 表達式1: 布爾類型的表達式,它總會返回一個布爾類型的值
> 當表達式1成立 ,則返回表達式2的值,當表達式1不成立,則返回表達式3的值;
> 是對 if else語法的一種簡化
~~~js
var num1 = 3;
var num2 = 6;
// 表達式1 ? 表達式2 : 表達式3
console.log(num1>num2?num1:num2);
var age = 17;
console.log(age>=18 ? '成年' : '未成年');
~~~
# switch語句
> 也常用語條件判斷,用于多個分支。
> 只能做 值相等判斷,而if可以做某個范圍判斷,在switch里面,使用的是嚴格模式,注意類型要一致 case滿足條件的時候,如果沒有break,會一直往下穿透,所以break不能忘。
~~~js
switch(expression){
case 常量1:
語句;
break;
case 常量2:
語句;
break;
case 常量3:
語句;
break;
...
case 常量n:
語句;
break;
default:
語句;
}
~~~
## 實例分析
getDay() 方法返回 0 至 6 之間的周名數字(weekday number)。
(Sunday=0, Monday=1, Tuesday=2 ..)
本例使用周名數字來計算周的名稱:
~~~
switch (new Date().getDay()) {
case 0:
day = "星期天";
break;
case 1:
day = "星期一";
break;
case 2:
day = "星期二";
break;
case 3:
day = "星期三";
break;
case 4:
day = "星期四";
break;
case 5:
day = "星期五";
break;
case 6:
day = "星期六";
}
~~~
結果將是:
~~~
今天是星期一
~~~
```js
let dayArray=['星期天','星期一','星期二','星期三','星期四','星期五','星期六']
console.log(dayArray[new Date().getDay()]);
```
> 在實際的應用中,你還可以更加的簡單,想想怎么操作更簡單?
# 練習
小明身高1.75,體重80.5kg。請根據BMI公式(體重除以身高的平方)幫小明計算他的BMI指數,并根據BMI指數:
* 低于18.5:過輕
* 18.5-25:正常
* 25-28:過重
* 28-32:肥胖
* 高于32:嚴重肥胖
用`if...else...`判斷并顯示結果:
~~~
'use strict';
var height = parseFloat(prompt('請輸入身高(m):'));
var weight = parseFloat(prompt('請輸入體重(kg):'));
var bmi = ???;
if ...
~~~
- 內容介紹
- EcmaScript基礎
- 快速入門
- 常量與變量
- 字符串
- 函數的基本概念
- 條件判斷
- 數組
- 循環
- while循環
- for循環
- 函數基礎
- 對象
- 對象的方法
- 函數
- 變量作用域
- 箭頭函數
- 閉包
- 高階函數
- map/reduce
- filter
- sort
- Promise
- 基本對象
- Arguments 對象
- 剩余參數
- Map和Set
- Json基礎
- RegExp
- Date
- async
- callback
- promise基礎
- promise-api
- promise鏈
- async-await
- 項目實踐
- 標簽系統
- 遠程API請求
- 面向對象編程
- 創建對象
- 原型繼承
- 項目實踐
- Classes
- 構造函數
- extends
- static
- 項目實踐
- 模塊
- import
- export
- 項目實踐
- 第三方擴展庫
- immutable
- Vue快速入門
- 理解MVVM
- Vue中的MVVM模型
- Webpack+Vue快速入門
- 模板語法
- 計算屬性和偵聽器
- Class 與 Style 綁定
- 條件渲染
- 列表渲染
- 事件處理
- 表單輸入綁定
- 組件基礎
- 組件注冊
- Prop
- 自定義事件
- 插槽
- 混入
- 過濾器
- 項目實踐
- 標簽編輯
- iView
- iView快速入門
- 課程講座
- 環境配置
- 第3周 Javascript快速入門