原文链接:https://javascript.info/ifelse,translate with ❤️ by zhangbao.

有时我们需要基于不同的判断条件执行不同的操作。

这里有一个 if 语句还有类似 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。因为这些都是“假值”。

  • 其他值都转换为 true,称为“真值”。

因此,在这种情况下的代码永远不会执行:

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

而这里的条件体总是会执行:

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

当然直接向 if 传递布尔值,也是 OK 的:

  1. let cond = (year == 2015); // 相等计算得出 true 或 false
  2. if (cond) {
  3. ...
  4. }

“else”子句

if 语句还可以使用可选的“else”块。他在 if 条件判断错误的情况下,执行。

例如:

  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?' ); // any value except 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);

如果这里使用“三元”或称“问号”运算符的话,可以更加简短和简单。

三元运算符用一个问号 ? 表示。 “三元”的正式术语是指操作符有三个操作数。它实际上是 JavaScript 中唯一一个三元运算符。

语法是:

  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。

  1. // 下面写一样
  2. 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. 如果返回 true,则返回 ‘Hi, baby!’,否则—执行冒号 “:” 后面的检查 age < 18。

  3. 如果返回 true,则返回 ‘Hello!’,否则—执行冒号 “:” 后面的检查 age < 100。

  4. 如果返回 true,则返回 ‘Greetings!’,否则—执行冒号 “:” 后面的语句,即返回 ‘What an unusual age!’。

如果用 if 语句改写的话,就是这样的:

  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. }

我们的眼睛垂直地扫描代码。跨越几行的结构比长水平指令集更容易理解。

问号运算符 ? 的作用是根据条件返回一个或另一个值,请用它来做这个。if 用于执行不同分支的代码。

(完)