原文链接:https://javascript.info/ifelse,translate with ❤️ by zhangbao.
有时我们需要基于不同的判断条件执行不同的操作。
这里有一个 if 语句还有类似 if 语句用“问号”运算符 ? 标记的简化版本的条件(三元)运算符,就是用来做这个的。
“if”语句
if 语句接收一个条件,并做计算,如果结果为 true,则执行代码。
例如:
let year = prompt('In which year was ECMAScript-2015 specification published?', '');
if (year == 2015) alert( 'You are right!' );
上面例子里,判断条件是个简单的等式判断 year == 2015,但是可以更加复杂。
如果有多于一条的语句需要执行,就要把代码包装在大括号中。
if (year == 2015) {
alert( "That's correct!" );
alert( "You're so smart!" );
}
建议时,在每次使用 if 的时候,总是将你的代码包装在大括号中 {},除非仅有一条语句的情况。这会增加可读性。
布尔值转换
if (…) 语句会将括号里的值转成布尔值。
我们回顾一下《类型转换》一章里提到的转换规则:
数值 0,空字符串 “”,null,undefined,NaN 都转换为 false。因为这些都是“假值”。
其他值都转换为 true,称为“真值”。
因此,在这种情况下的代码永远不会执行:
if (0) { // 0 是假值
...
}
而这里的条件体总是会执行:
if (1) { // 1 是真值
...
}
当然直接向 if 传递布尔值,也是 OK 的:
let cond = (year == 2015); // 相等计算得出 true 或 false
if (cond) {
...
}
“else”子句
if 语句还可以使用可选的“else”块。他在 if 条件判断错误的情况下,执行。
例如:
let year = prompt('In which year was ECMAScript-2015 specification published?', '');
if (year == 2015) {
alert( 'You guessed it right!' );
} else {
alert( 'How can you be so wrong?' ); // any value except 2015
}
几个条件:“else if”
有时我们想测试一个条件的几个变体。这时有 else if 子句可供使用。
例如:
let year = prompt('In which year was ECMAScript-2015 specification published?', '');
if (year < 2015) {
alert( 'Too early...' );
} else if (year > 2015) {
alert( 'Too late' );
} else {
alert( 'Exactly!' );
}
上面代码里,JavaScript 首先检查 year < 2015。如果是假值的话,就进入到下一个条件判断 year > 2015,否则的话显示最后一个 alert。
这里还可以有更多的 else if 块,结束的 else 是可选的。
三元运算符 “?”
有时我们需要根据一个条件分配一个变量。
例如:
let accessAllowed;
let age = prompt('How old are you?', '');
if (age > 18) {
accessAllowed = true;
} else {
accessAllowed = false;
}
alert(accessAllowed);
如果这里使用“三元”或称“问号”运算符的话,可以更加简短和简单。
三元运算符用一个问号 ? 表示。 “三元”的正式术语是指操作符有三个操作数。它实际上是 JavaScript 中唯一一个三元运算符。
语法是:
let result = condition ? value1 : value2
条件判断时,如果是真值,就返回 value1,否则返回 value2。
例如:
let accessAllowed = (age > 18) ? true : false;
技术上,我们可以忽略 age > 18 外面的括号。问号操作符的运算级比较低。它会在比较运算符 > 之后执行,因此写成下面是一样的:
// 比较运算符"age > 18" 总是首先执行
// (无需包装在括号中)
let accessAllowed = age > 18 ? true : false;
但是括号使代码更具可读性,所以建议使用它们。
请注意:
在上面的例子中,可以避开问号操作符,因为比较本身就返回 true/false。
// 下面写一样
let accessAllowed = age > 18;
多个“?”
一连串的问号 ? 操作符允许返回一个依赖于多个条件的值。
例如:
let age = prompt('age?', 18);
let message = (age < 3) ? 'Hi, baby!' :
(age < 18) ? 'Hello!' :
(age < 100) ? 'Greetings!' :
'What an unusual age!';
alert( message );
一开始可能很难理解到底发生了什么。但仔细观察之后,我们可以看到,这只是一个普通的测试序列。
第一个问号检查 age < 3。
如果返回 true,则返回 ‘Hi, baby!’,否则—执行冒号 “:” 后面的检查 age < 18。
如果返回 true,则返回 ‘Hello!’,否则—执行冒号 “:” 后面的检查 age < 100。
如果返回 true,则返回 ‘Greetings!’,否则—执行冒号 “:” 后面的语句,即返回 ‘What an unusual age!’。
如果用 if 语句改写的话,就是这样的:
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.');
取决与判断条件 company == ‘Netscape’,返回 ? 后面的第一个或者第二部分。
我们不会在这里给一个变量赋值。其思想是根据条件执行不同的代码。
不建议以这种方式使用问号操作符。
这种语法似乎比 if 更简短,这对一些程序员很有吸引力。但它的可读性更差。
下面是与 if 比较的代码:
let company = prompt('Which company created JavaScript?', '');
if (company == 'Netscape') {
alert('Right!');
} else {
alert('Wrong.');
}
我们的眼睛垂直地扫描代码。跨越几行的结构比长水平指令集更容易理解。
问号运算符 ? 的作用是根据条件返回一个或另一个值,请用它来做这个。if 用于执行不同分支的代码。
(完)