有时我们需要根据不同条件执行不同的操作。
我们可以使用 if 语句和条件运算符 ?(也称为“问号”运算符)来实现。

“if” 语句

if(…) 语句计算括号里的条件表达式,如果计算结果是 true,就会执行对应的代码块。
例如:

  1. let year = prompt('In which year was ECMAScript-2015 specification published?', '');
  2. if (year == 2015) alert( 'You are right!' );

在上面这个例子中,条件是一个简单的相等性检查(year == 2015),但它还可以更复杂。
如果有多个语句要执行,我们必须将要执行的代码块封装在大括号内:

  1. if (year == 2015) {
  2. alert( "That's correct!" );
  3. alert( "You're so smart!" );
  4. }

建议每次使用 if 语句都用大括号 {} 来包装代码块,即使只有一条语句。这样可以提高代码可读性。

布尔转换

if (…) 语句会计算圆括号内的表达式,并将计算结果转换为布尔型。
让我们回顾一下 类型转换 一章中的转换规则:

  • 数字 0、空字符串 “”、null、undefined 和 NaN 都会被转换成 false。因为它们被称为“假值(falsy)”值。
  • 其他值被转换为 true,所以它们被称为“真值(truthy)”。

所以,下面这个条件下的代码永远不会执行:

  1. if (0) { // 0 是假值(falsy)
  2. ...
  3. }

……但下面的条件 —— 始终有效:

  1. if (1) { // 1 是真值(truthy)
  2. ...
  3. }

我们也可以将未计算的布尔值传入 if 语句,像这样:

  1. let cond = (year == 2015); // 相等运算符的结果是 true 或 false
  2. if (cond) {
  3. ...
  4. }

“else” 语句

if 语句有时会包含一个可选的 “else” 块。如果判断条件不成立,就会执行它内部的代码。
例如:

  1. let year = prompt('In which year was ECMAScript-2015 specification published?', '');
  2. if (year == 2015) {
  3. alert( 'You guessed it right!' );
  4. } else {
  5. alert( 'How can you be so wrong?' ); // 2015 以外的任何值
  6. }

多个条件:“else if”

有时我们需要测试一个条件的几个变体。我们可以通过使用 else if 子句实现。
例如:

  1. let year = prompt('In which year was ECMAScript-2015 specification published?', '');
  2. if (year < 2015) {
  3. alert( 'Too early...' );
  4. } else if (year > 2015) {
  5. alert( 'Too late' );
  6. } else {
  7. alert( 'Exactly!' );
  8. }

在上面的代码中,JavaScript 先检查 year < 2015。
如果条件不符合,就会转到下一个条件 year > 2015。
如果这个条件也不符合,则会显示最后一个 alert。
可以有更多的 else if 块。结尾的 else 是可选的。

条件运算符 ‘?’

有时我们需要根据一个条件去赋值一个变量。
如下所示:

  1. let accessAllowed;
  2. let age = prompt('How old are you?', '');
  3. if (age > 18) {
  4. accessAllowed = true;
  5. } else {
  6. accessAllowed = false;
  7. }
  8. alert(accessAllowed);

所谓的“条件”或“问号”运算符让我们可以更简短地达到目的。
这个运算符通过问号 ? 表示。有时它被称为三元运算符被称为“三元”是因为该运算符中有三个操作数
语法:

  1. let result = condition ? value1 : value2;

计算条件结果,如果结果为真,则返回 value1,否则返回 value2。
例如:

  1. let accessAllowed = (age > 18) ? true : false;

技术上讲,我们可以省略 age > 18 外面的括号。问号运算符的优先级较低,所以它会在比较运算符 > 后执行。
下面这个示例会执行和前面那个示例相同的操作:

  1. // 比较运算符 "age > 18" 首先执行
  2. //(不需要将其包含在括号中)
  3. let accessAllowed = age > 18 ? true : false;

但括号可以使代码可读性更强,所以我们建议使用它们。

请注意: 在上面的例子中,你可以不使用问号运算符,因为比较本身就返回 true/false: // 下面代码同样可以实现
let accessAllowed = age > 18;

多个 ‘?’

使用一系列问号 ? 运算符可以返回一个取决于多个条件的值
例如:

  1. let age = prompt('age?', 18);
  2. let message = (age < 3) ? 'Hi, baby!' :
  3. (age < 18) ? 'Hello!' :
  4. (age < 100) ? 'Greetings!' :
  5. 'What an unusual age!';
  6. alert( message );

可能很难一下子看出发生了什么。但经过仔细观察,我们可以看到它只是一个普通的检查序列。

  1. 第一个问号检查 age < 3。
  2. 如果为真 — 返回 ‘Hi, baby!’。否则,会继续执行冒号 “:” 后的表达式,检查 age < 18。
  3. 如果为真 — 返回 ‘Hello!’。否则,会继续执行下一个冒号 “:” 后的表达式,检查 age < 100。
  4. 如果为真 — 返回 ‘Greetings!’。否则,会继续执行最后一个冒号 “:” 后面的表达式,返回 ‘What an unusual age!’。

这是使用 if..else 实现上面的逻辑的写法:

  1. if (age < 3) {
  2. message = 'Hi, baby!';
  3. } else if (age < 18) {
  4. message = 'Hello!';
  5. } else if (age < 100) {
  6. message = 'Greetings!';
  7. } else {
  8. message = 'What an unusual age!';
  9. }

‘?’ 的非常规使用

有时可以使用问号 ? 来代替 if 语句:

  1. let company = prompt('Which company created JavaScript?', '');
  2. (company == 'Netscape') ?
  3. alert('Right!') : alert('Wrong.');

根据条件 company ==’Netscape’,要么执行 ? 后面的第一个表达式并显示对应内容,要么执行第二个表达式并显示对应内容。
在这里我们不是把结果赋值给变量。而是根据条件执行不同的代码。
不建议这样使用问号运算符。
这种写法比 if 语句更短,对一些程序员很有吸引力。但它的可读性差。
下面是使用 if 语句实现相同功能的代码,进行下比较:

  1. let company = prompt('Which company created JavaScript?', '');
  2. if (company == 'Netscape') {
  3. alert('Right!');
  4. } else {
  5. alert('Wrong.');
  6. }

因为我们的眼睛垂直扫描代码。所以,跨越几行的代码块比长而水平的代码更易于理解。