- if 语句
- 三元运算符
- 开发中很少使用 switch 语句(甚至有的公司禁止使用)
JavaScript 提供if
结构和switch
结构,完成条件判断,即只有满足预设的条件,才会执行相应的语句。
if 结构
if
结构先判断一个表达式的布尔值,然后根据布尔值的真伪,执行不同的语句。所谓布尔值,指的是 JavaScript 的两个特殊值,true
表示“真”,false
表示“伪”。
if (布尔值)
语句;
// 或者
if (布尔值) 语句;
上面是if
结构的基本形式。需要注意的是,“布尔值”往往由一个条件表达式产生的,必须放在圆括号中,表示对表达式求值。如果表达式的求值结果为true
,就执行紧跟在后面的语句;如果结果为false
,则跳过紧跟在后面的语句。
if (m === 3)
m = m + 1;
上面代码表示,只有在m
等于3时,才会将其值加上1。
这种写法要求条件表达式后面只能有一个语句。如果想执行多个语句,必须在if
的条件判断之后,加上大括号,表示代码块(多个语句合并成一个语句)。
if (m === 3) {
m += 1;
}
建议总是在if
语句中使用大括号,因为这样方便插入语句。
注意,if
后面的表达式之中,不要混淆赋值表达式(=
)、严格相等运算符(===
)和相等运算符(==
)。尤其是赋值表达式不具有比较作用。
var x = 1;
var y = 2;
if (x = y) {
console.log(x);
}
// "2"
上面代码的原意是,当x
等于y
的时候,才执行相关语句。但是,不小心将严格相等运算符写成赋值表达式,结果变成了将y
赋值给变量x
,再判断变量x
的值(等于2)的布尔值(结果为true
)。
这种错误可以正常生成一个布尔值,因而不会报错。为了避免这种情况,有些开发者习惯将常量写在运算符的左边,这样的话,一旦不小心将相等运算符写成赋值运算符,就会报错,因为常量不能被赋值。
if (x = 2) { // 不报错
if (2 = x) { // 报错
至于为什么优先采用“严格相等运算符”(===
),而不是“相等运算符”(==
),请参考《运算符》章节。
if…else 结构
if
代码块后面,还可以跟一个else
代码块,表示不满足条件时,所要执行的代码。
if (m === 3) {
// 满足条件时,执行的语句
} else {
// 不满足条件时,执行的语句
}
上面代码判断变量m
是否等于3,如果等于就执行if
代码块,否则执行else
代码块。
对同一个变量进行多次判断时,多个if...else
语句可以连写在一起。
if (m === 0) {
// ...
} else if (m === 1) {
// ...
} else if (m === 2) {
// ...
} else {
// ...
}
else
代码块总是与离自己最近的那个if
语句配对。
var m = 1;
var n = 2;
if (m !== 1)
if (n === 2) console.log('hello');
else console.log('world');
上面代码不会有任何输出,else
代码块不会得到执行,因为它跟着的是最近的那个if
语句,相当于下面这样。
if (m !== 1) {
if (n === 2) {
console.log('hello');
} else {
console.log('world');
}
}
如果想让else
代码块跟随最上面的那个if
语句,就要改变大括号的位置。
if (m !== 1) {
if (n === 2) {
console.log('hello');
}
} else {
console.log('world');
}
// world
switch 结构
多个if...else
连在一起使用的时候,可以转为使用更方便的switch
结构。
switch (fruit) {
case "banana":
// ...
break;
case "apple":
// ...
break;
default:
// ...
}
上面代码根据变量fruit
的值,选择执行相应的case
。如果所有case
都不符合,则执行最后的default
部分。需要注意的是,每个case
代码块内部的break
语句不能少,否则会接下去执行下一个case
代码块,而不是跳出switch
结构。
var x = 1;
switch (x) {
case 1:
console.log('x 等于1');
case 2:
console.log('x 等于2');
default:
console.log('x 等于其他值');
}
// x 等于1
// x 等于2
// x 等于其他值
上面代码中,**case**
代码块之中没有**break**
语句,导致不会跳出**switch**
结构,而会一直执行下去。正确的写法是像下面这样。
switch (x) {
case 1:
console.log('x 等于1');
break;
case 2:
console.log('x 等于2');
break;
default:
console.log('x 等于其他值');
}
switch
语句部分和case
语句部分,都可以使用表达式。
switch (1 + 3) {
case 2 + 2:
f();
break;
default:
neverHappens();
}
上面代码的default
部分,是永远不会执行到的。
需要注意的是,**switch**
语句后面的表达式,与**case**
语句后面的表示式比较运行结果时,采用的是严格相等运算符(**===**
),而不是相等运算符(**==**
),这意味着比较时不会发生类型转换。
1 == true // => true
1 === true // => false
var x = 1;
switch (x) {
case true:
console.log('x 发生类型转换');
break;
default:
console.log('x 没有发生类型转换');
}
// x 没有发生类型转换
上面代码中,由于变量x
没有发生类型转换,所以不会执行case true
的情况。这表明,switch
语句内部采用的是“严格相等运算符”,详细解释请参考《运算符》一节。
三元运算符 ?:
JavaScript 还有一个三元运算符(即该运算符需要三个运算子)?:
,也可以用于逻辑判断。
(条件) ? 表达式1 : 表达式2
上面代码中,如果“条件”为true
,则返回“表达式1”的值,否则返回“表达式2”的值。
var even = (n % 2 === 0) ? true : false;
上面代码中,如果n
可以被2整除,则even
等于true
,否则等于false
。它等同于下面的形式。
var even;
if (n % 2 === 0) {
even = true;
} else {
even = false;
}
三元运算符可以被视为**if...else...**
的简写形式,因此可以用于多种场合。
var myVar;
console.log(
myVar ?
'myVar has a value' :
'myVar does not have a value'
)
// myVar does not have a value
上面代码利用三元运算符,输出相应的提示。
var msg = '数字' + n + '是' + (n % 2 === 0 ? '偶数' : '奇数');
上面代码利用三元运算符,在字符串之中插入不同的值。
练习1
假设 number 是存放的是用户输入的一个数字
若不是三位数,则提示用户输入有误
若是三位数,则判断该数能否被 13 整除
var number = 130;
if (isNaN(number) || number < 100 || number > 999) {
console.log("输入有误");
} else {
if (number % 13 === 0) {
console.log("能被13整除")
} else {
console.log("不能被13整除")
}
}
练习2
假设 score 是用户输入一个成绩(0-100),判断这个成绩属于哪个范围并输出结果(A:90-100 B:70-89 C:60-69 D:40-59 E:0-39),若用户输入的不是0-100的数字,则输出输入有误。
var score = 80;
if (isNaN(score) || score < 0 || score > 100) {
console.log("输入有误");
} else {
if (score >= 90) {
console.log("A")
} else if (score >= 70) {
console.log("B")
} else if (score >= 60) {
console.log("C")
} else if (score >= 40) {
console.log("D")
} else {
console.log("E");
}
}
练习3
根据世界卫生组织推荐的计算方法:
男性标准体重计算方法为(身高cm-80)×70﹪
女性标准体重计算方法为(身高cm-70)×60﹪
标准体重正负10%为正常体重
低于标准体重的10%为过瘦
高于标准体重的10%为过重
编写程序,让用户输入性别、身高、体重,判断用户的健康状况,健康状况有 3 种:
- 你的体重正常,请继续保持
- 你的身体偏瘦,请加强营养
- 你的身体偏胖,请加强锻炼
var height = 166;
var weight = 66;
var gender = '男';
if (isNaN(height) || isNaN(weight) || gender !== "男" && gender !== "女") {
console.log("输入有误");
} else {
var standardWeight; //标准体重
if (gender === "男") {
standardWeight = (height - 80) * 0.7;
} else {
standardWeight = (height - 70) * 0.6;
}
if (weight < standardWeight * 0.9) {
console.log("你的身体偏瘦,请加强营养");
} else if (weight > standardWeight * 1.1) {
console.log("你的身体偏胖,请加强锻炼")
} else {
console.log("你的体重正常,请继续保持");
}
}
练习4
某理财公司推出一种理财服务,服务规则如下:
- 若用户的理财金额在50万元以下,则每年的收益按照4%计算。
- 若用户的理财金额在50万元以上(包括50万),则每年收益按照4.5%计算。
- 若用户的理财金额超过200万,除了理财收益外,还要额外给予用户收益金额的10%
编写程序,让用户输入理财金额和理财年限,计算到期后的收益
var money = 1000000;
var year = 1;
if (isNaN(money) || isNaN(year) || money <= 0 || year <= 0) {
console.log("输入有误");
} else {
var rate = 0.04; // 年利率4%
if (money >= 500000) {
rate = 0.045;
}
var earnMoney = money * rate * year; // 收益
if (money >= 2000000) {
earnMoney += earnMoney * 0.1;
}
console.log(`总收益为:${earnMoney}`);
}
练习5
编写一个用户和计算机猜拳的游戏,用户输入剪刀、石头或布,与计算机的出拳进行比较,判断胜负。
var fist = "剪刀";
if (fist === "剪刀" || fist === "石头" || fist === "布") {
//正确
//1. 模拟计算机出拳
var rad = Math.random(); // 0~1
var pcFist; //计算机出拳结果
if (rad < 0.333) {
pcFist = "剪刀";
} else if (rad < 0.6666) {
pcFist = "石头";
} else {
pcFist = "布";
}
//2. 比较胜负
console.log(`你的出拳:${fist}, 电脑出拳:${pcFist}`);
if (fist === "剪刀" && pcFist === "布" ||
fist === "布" && pcFist === "石头" ||
fist === "石头" && pcFist === "剪刀") {
console.log("你胜利了!");
} else if (fist === pcFist) {
console.log("平局");
} else {
console.log("电脑胜利!");
}
} else {
console.log("输入有误")
}