精讲 JavaScript 条件运算符:if 和 '?'

简介: 精讲 JavaScript 条件运算符:if 和 '?'

640.png


条件运算符: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 (…) 语句会计算圆括号内的表达式,并将计算结果转换为布尔型。

让我们回顾一下 类型转换[1] 一章中的转换规则:

  • 数字 0、空字符串 ""nullundefinedNaN 都会被转换成 false。因为他们被称为 “falsy” 值。
  • 其他值被转换为 true,所以它们被称为 “truthy”。


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


if (0) { // 0 是 falsy
  ...
}


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


if (1) { // 1 是 truthy
  ...
}


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


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


"else" 语句


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

例如:


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?' ); // 2015 以外的任何值
}


多个条件:"else if"


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

例如:


let year = prompt('In which year was ECMAScript-2015 specification published?', '');
if (year < 2015) {
  alert( 'Too early...' );
} elseif (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 );


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

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

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


if (age < 3) {
  message = 'Hi, baby!';
} elseif (age < 18) {
  message = 'Hello!';
} elseif (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


作业题


先自己做题目再看答案。


1. if(值为 0 的字符串)

重要程度:⭐️⭐️⭐️⭐️⭐️

alert 弹窗会出来吗?


if ("0") {
  alert( 'Hello' );
}


2. JavaScript 的名字


重要程度:⭐️⭐


使用 if..else 结构,实现提问 "What is the "official" name of JavaScript?" 的代码

如果访问者输入了 "ECMAScript",输出就提示 "Right!",否则 — 输出:"Didn't know? ECMAScript!"

640.png

点击链接查看演示示例:https://zh.js.cx/task/check-standard/ifelse_task2/


3. 显示符号


重要程度:⭐️⭐

使用 if..else 语句,编写代码实现通过 prompt 获取一个数字并用 alert 显示结果:

  • 如果这个数字大于 0,就显示 1
  • 如果这个数字小于 0,就显示 -1
  • 如果这个数字等于 0,就显示 0

在这个任务中,我们假设输入永远是一个数字。

点击链接查看演示示例:https://zh.js.cx/task/sign/if_sign/


4. 使用 '?' 重写 'if' 语句


重要程度:⭐️⭐️⭐️⭐️⭐️


使用条件运算符 '?' 重写下面的 if 语句:


let result;
if (a + b < 4) {
  result = 'Below';
} else {
  result = 'Over';
}


5. 使用 '?' 重写 'if..else' 语句

重要程度:⭐️⭐️⭐️⭐️⭐️

使用多个三元运算符 '?' 重写下面的 if..else 语句。

为了增强代码可读性,建议将代码分成多行。


let message;
if (login == 'Employee') {
  message = 'Hello';
} elseif (login == 'Director') {
  message = 'Greetings';
} elseif (login == '') {
  message = 'No login';
} else {
  message = '';
}


答案

1. if(值为 0 的字符串)

是的,它会


任何非空字符串("0" 不是空字符串)的逻辑值都是 true

我们可以执行下面的代码来进行验证:


if ("0") {
  alert( 'Hello' );
}


2. JavaScript 的名字

代码如下:


<!DOCTYPE html>
<html>
<body>
  <script>
    'use strict';
    let value = prompt('What is the "official" name of JavaScript?', '');
    if (value == 'ECMAScript') {
      alert('Right!');
    } else {
      alert("You don't know? ECMAScript!");
    }
  </script>
</body>
</html>


3. 显示符号

代码如下:


let value = prompt('Type a number', 0);
if (value > 0) {
  alert( 1 );
} elseif (value < 0) {
  alert( -1 );
} else {
  alert( 0 );
}


4. 使用 '?' 重写 'if' 语句

代码如下:


let result = (a + b < 4) ? 'Below' : 'Over';


5. 使用 '?' 重写 'if..else' 语句


代码如下:


let message = (login == 'Employee') ? 'Hello' :
  (login == 'Director') ? 'Greetings' :
  (login == '') ? 'No login' :
  '';
目录
相关文章
|
1月前
|
JavaScript
js运算符
js运算符
22 5
|
1月前
|
JavaScript 前端开发
JavaScript 运算符全知道
JavaScript 运算符全知道
52 0
|
2月前
|
JavaScript 前端开发
JavaScript 运算符
JavaScript 运算符
21 3
|
3月前
|
JavaScript 前端开发
JavaScript 中的 typeof 运算符
【8月更文挑战第29天】
25 1
|
6月前
|
存储 JavaScript 前端开发
【JavaScript技术专栏】JavaScript基础入门:变量、数据类型与运算符
【4月更文挑战第30天】本文介绍了JavaScript的基础知识,包括变量(var、let、const)、数据类型(Number、String、Boolean、Undefined、Null及Object、Array)和运算符(算术、赋值、比较、逻辑)。通过实例展示了如何声明变量、操作数据类型以及使用运算符执行数学和逻辑运算。了解这些基础知识对初学者至关重要,是进阶学习JavaScript的关键。
46 0
|
3月前
|
JavaScript 前端开发 安全
深入理解JavaScript中的比较运算符
深入理解JavaScript中的比较运算符
|
3月前
|
前端开发 JavaScript 程序员
聊聊前端 JavaScript 的扩展运算符 “...“ 的使用场景
聊聊前端 JavaScript 的扩展运算符 “...“ 的使用场景
|
3月前
|
JavaScript 前端开发
JS常见的运算符有哪些?
JS常见的运算符有哪些?
|
3月前
|
JavaScript 前端开发
JavaScript基础&实战(2)js中的强制类型转换、运算符、关系运算符、逻辑运算符、条件运算符
这篇文章详细介绍了JavaScript中的强制类型转换、运算符(包括算术、逻辑、条件、赋值和关系运算符)的使用方法和优先级规则。
JavaScript基础&实战(2)js中的强制类型转换、运算符、关系运算符、逻辑运算符、条件运算符
|
4月前
|
JavaScript 前端开发 网络架构
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
57 1