|
| 1 | +# WTF JavaScript 极简教程: 4. 运算符 |
| 2 | + |
| 3 | +WTF JavaScript 教程,帮助新人快速入门 JavaScript。 |
| 4 | + |
| 5 | +**推特**:[@WTFAcademy_](https://twitter.com/WTFAcademy_) | [@0xAA_Science](https://twitter.com/0xAA_Science) |
| 6 | + |
| 7 | +**WTF Academy 社群:** [官网 wtf.academy](https://wtf.academy/) | [WTF Solidity 教程](https://github.com/AmazingAng/WTFSolidity) | [discord](https://discord.wtf.academy/) | [微信群申请](https://docs.google.com/forms/d/e/1FAIpQLSe4KGT8Sh6sJ7hedQRuIYirOoZK_85miz3dw7vA1-YjodgJ-A/viewform?usp=sf_link) |
| 8 | + |
| 9 | +所有代码和教程开源在 github: [github.com/WTFAcademy/WTF-Javascript](https://github.com/WTFAcademy/WTF-Javascript) |
| 10 | + |
| 11 | +--- |
| 12 | + |
| 13 | +这一讲,我们将介绍 JavaScript 中常用的运算符:算数运算符、逻辑运算符。 |
| 14 | + |
| 15 | +## 1. 算数运算符 |
| 16 | + |
| 17 | +算数运算符是和计算相关的运算符, 我们把算数运算符分为以下几类: |
| 18 | + |
| 19 | +- 加法`+` |
| 20 | +- 减法`-` |
| 21 | +- 乘法`*` |
| 22 | +- 除法`/` |
| 23 | +- 取余`%` |
| 24 | +- 求幂`**` |
| 25 | +- 递增`++` |
| 26 | +- 递减`--` |
| 27 | + |
| 28 | +前三个都非常简单,我们介绍后五个运算符。 |
| 29 | + |
| 30 | +### 1.1 除法`/` |
| 31 | + |
| 32 | +如果你之前学过一些别的编程语言,例如Java、C、C++等,你会知道在很多编程语言中,除法`/`一般都是作整除运算。但是在JavaScript中,除法`/`就是指数学上的除。如果你需要整除运算,则需要调用`Math.floor()`进行向下取整。 |
| 33 | + |
| 34 | +```js |
| 35 | +5 / 4; // 1.25 |
| 36 | +Math.floor(5 / 4); // 1 |
| 37 | +8 / 9; //0.8888888888888888 |
| 38 | +Math.floor(8 / 9); // 0 |
| 39 | +``` |
| 40 | + |
| 41 | +### 1.2 取余`%` |
| 42 | + |
| 43 | +`a % b`结果是`a`整除`b`的余数。 |
| 44 | + |
| 45 | +```js |
| 46 | +5 % 4; // 1,5除以4的余数 |
| 47 | +8 % 9; // 8,8除以9的余数 |
| 48 | +``` |
| 49 | + |
| 50 | +### 1.3 求幂`**` |
| 51 | + |
| 52 | +`a ** b`结果是`a`的`b`次幂。 |
| 53 | + |
| 54 | +```js |
| 55 | +2 ** 2; // 2² = 4 |
| 56 | +2 ** 3; // 2³ = 8 |
| 57 | +``` |
| 58 | + |
| 59 | +### 1.4 递增和递减`++` `--` |
| 60 | + |
| 61 | +递增和递减运算符的原理都类似,我们以递增运算符作为讲解。递增运算符有两个形式: |
| 62 | + |
| 63 | +- 前缀形式(++i):运算符在变量的前面,先递增,后执行语句。 |
| 64 | +- 后缀形式(i++):运算符在变量的后面,先执行语句,后递增。 |
| 65 | + |
| 66 | +```js |
| 67 | +let num1 = 1, num2 = 1; |
| 68 | +console.log(++num1, num1) // 2 2 |
| 69 | +console.log(num2++, num2) // 1 2 |
| 70 | +``` |
| 71 | + |
| 72 | +## 2. 逻辑运算符 |
| 73 | + |
| 74 | +JavaScript中有四个逻辑运算符: |
| 75 | + |
| 76 | +- 或`||` |
| 77 | +- 与`&&` |
| 78 | +- 非`!` |
| 79 | +- 空值合并`??` |
| 80 | + |
| 81 | +### 2.1 或`||` |
| 82 | + |
| 83 | +或运算是指当参与运算的任何一个参数为`true`时,返回的结果就为`true`,否则就返回`false`。 |
| 84 | + |
| 85 | +我们可以把或运算理解为“寻找第一个真值,如果没有找到返回最后一个值”的运算。 |
| 86 | + |
| 87 | +```js |
| 88 | +true || true; // true |
| 89 | +false || true; // true |
| 90 | +true || false; // true |
| 91 | +false || false; // false |
| 92 | + |
| 93 | +// 理解为寻找第一个真值 |
| 94 | +null || 1; // 1(1是第一个真值) |
| 95 | +null || true || 1; // true(true是第一个真值) |
| 96 | +null || undefined || 0; // 0(都是假值,返回最后一个值) |
| 97 | +``` |
| 98 | + |
| 99 | +### 2.2 与`&&` |
| 100 | + |
| 101 | +与运算是指当参与运算的任何一个参数为`false`时,返回的结果就为`false`,否则就返回`true`。 |
| 102 | + |
| 103 | +我们可以把与运算理解为“寻找第一个假值,如果没有找到返回最后一个值”的运算。 |
| 104 | + |
| 105 | +```js |
| 106 | +true && true; // true |
| 107 | +false && true; // false |
| 108 | +true && false; // false |
| 109 | +false && false; // false |
| 110 | + |
| 111 | +// 理解为寻找第一个假值 |
| 112 | +1 && 2 && null && 3; // null(找到假值,返回假值) |
| 113 | +1 && 2 && 3; // 3(没有找到假值,返回最后一个值) |
| 114 | +``` |
| 115 | + |
| 116 | +### 2.3 非`!` |
| 117 | + |
| 118 | +非运算符是把操作数转换为布尔类型,并返回相反的值。非`!`运算符在逻辑运算符中优先级最高,比或`||`运算符和与`&&`运算符优先级高。 |
| 119 | + |
| 120 | +```js |
| 121 | +!true; // false |
| 122 | +!null; // true |
| 123 | +!!null; // false |
| 124 | +!undefined; // true |
| 125 | +``` |
| 126 | + |
| 127 | +### 2.4 空值合并`??` |
| 128 | + |
| 129 | +对于`a ?? b`的结果为: |
| 130 | + |
| 131 | +- 如果`a`的值不是`null`或`undefined`,则结果为`a` |
| 132 | +- 如果`a`的值是`null`或`undefined`,则结果为`b` |
| 133 | + |
| 134 | +`a ?? b`的结果可以等价于三目运算符: |
| 135 | + |
| 136 | +`(a !== null && a !== undefined) ? a : b` |
| 137 | + |
| 138 | +我们可以通过空值合并运算符计算出找到第一个不是`null`和`undefined`的值。 |
| 139 | + |
| 140 | +```js |
| 141 | +let course; |
| 142 | +course ?? 'WTF'; // WTF(course值为undefined,返回后一个值) |
| 143 | + |
| 144 | +let name = '0xAA' |
| 145 | +name ?? 'WTF'; // 0xAA(name值存在,返回第一个值) |
| 146 | +``` |
| 147 | +
|
| 148 | +## 习题 |
| 149 | +
|
| 150 | +请思考下面代码每一行的输出,并将结果写下来。你可以在链接【注:文档修改要跳转,此处没跳转】上找到这段代码,运行它,并验证你的结果是否正确。 |
| 151 | +
|
| 152 | +```js |
| 153 | +console.log(1 + (2 ** 3) / 2) // 5 |
| 154 | + |
| 155 | +let x = 10 |
| 156 | +console.log(x++ % 2, x) // 0 11 |
| 157 | + |
| 158 | +console.log(null || 1 && 2 || 3) // 2 |
| 159 | +// null || 1 返回1 (找真,有真返回1) |
| 160 | +// 1 && 2 返回2 (找假,没有假返回最后一个) |
| 161 | +// 2 || 3 返回2 (找真,找到第一个真就返回) |
| 162 | +``` |
| 163 | +
|
| 164 | +扩展题目:请判断下面代码输出的结果,并思考JavaScript在做浮点运算时需要注意什么,为什么solidity不支持浮点类型? |
| 165 | +
|
| 166 | +```js |
| 167 | +console.log(0.1 + 0.2 === 0.3) // false |
| 168 | + |
| 169 | +// 修改: |
| 170 | +(0.1 * 10 + 0.2 * 10) / 10 // 0.3 |
| 171 | +``` |
| 172 | +
|
| 173 | +## 总结 |
| 174 | +
|
| 175 | +这一讲,我们介绍了基本的运算符:算数运算符,逻辑运算符。你会在之后的 JavaScript 之旅中不断和他们打交道! |
| 176 | +
|
0 commit comments