13
13
14
14
比如:` + ` 、` * ` 、` / ` 、` ( ` 都是** 运算符** ,而` (3+5)/2 ` 则是** 表达式** 。
15
15
16
- 比如:typeof 就是运算符,可以来获得一个值的类型。它会将该值的类型以** 字符串** 的形式返回,返回值可以是 number string boolean undefined object。
16
+ 比如:typeof 就是运算符,可以来获得一个值的类型。它会将该值的类型以** 字符串** 的形式返回,返回值可以是 number、 string、 boolean、 undefined、 object。
17
17
18
18
19
19
### 运算符的分类
@@ -217,6 +217,8 @@ number
217
217
218
218
- ` ! ` 非:对一个布尔值进行取反。
219
219
220
+ 注意:能参与逻辑运算的,都是布尔值。
221
+
220
222
** 连比的写法:**
221
223
222
224
来看看逻辑运算符连比的写法。
@@ -229,43 +231,19 @@ console.log(3 < 2 && 2 < 4);
229
231
230
232
输出结果为false。
231
233
232
- 举例2:(判断一个人的年龄是否在18~ 60岁之间)
233
-
234
- ``` javascript
235
- var a = prompt (" 请输入您的年龄" );
236
- alert (a>= 18 && a<= 65 );
237
- ```
238
-
239
-
240
- PS:上面的这个` a>=18 && a<= 65 ` 千万别想当然的写成` 18<= a <= 65 ` ,没有这种语法。
241
-
242
- ### 注意事项
243
-
244
- (1)能参与逻辑运算的,都是布尔值。
245
-
246
- (2)JS中的` && ` 属于** 短路** 的与,如果第一个值为false,则不会看第二个值。举例:
234
+ 举例2:(判断一个人的年龄是否在18~ 65岁之间)
247
235
248
236
``` javascript
249
- // 第一个值为true,会检查第二个值
250
- true && alert (" 看我出不出来!!" ); // 可以弹出 alert 框
251
-
252
- // 第一个值为false,不会检查第二个值
253
- false && alert (" 看我出不出来!!" ); // 不会弹出 alert 框
254
- ```
237
+ const a = prompt (' 请输入您的年龄' );
255
238
256
- (3)JS中的` || ` 属于** 短路** 的或,如果第一个值为true,则不会看第二个值。举例:
257
-
258
- (4)如果对** 非布尔值** 进行逻辑运算,则会** 先将其转换为布尔值** ,然后再操作。举例:
259
-
260
- ``` javascript
261
- var a = 10 ;
262
- a = ! a;
263
-
264
- console .log (a); // false
265
- console .log (typeof a); // boolean
239
+ if (a >= 18 && a < 65 ) {
240
+ alert (' 可以上班' );
241
+ } else {
242
+ alert (' 准备退休' );
243
+ }
266
244
```
267
245
268
- 上面的例子,我们可以看到,对非布尔值进行 ` ! ` 操作之后,返回结果为布尔值 。
246
+ PS:上面的 ` a>=18 && a<= 65 ` 千万别想当然地写成 ` 18<= a <= 65 ` ,没有这种语法 。
269
247
270
248
### 非布尔值的与或运算【重要】
271
249
@@ -282,23 +260,23 @@ console.log('result:' + result); // 打印结果:6(也就是说最后面
282
260
283
261
那么,返回结果是哪个原值呢?我们来看一下。
284
262
285
- ** 与运算** 的返回结果:(以两个非布尔值的运算为例 )
263
+ ** 与运算** 的返回结果:(以多个非布尔值的运算为例 )
286
264
287
- - 如果第一个值为false,则直接返回第一个值 ;不会再往后执行。
265
+ - 如果第一个值为false,则执行第一条语句,并直接返回第一个值 ;不会再往后执行。
288
266
289
- - 如果第一个值为true,则返回第二个值 (如果所有的值都为true,则返回的是最后一个值)。
267
+ - 如果第一个值为true,则继续执行第二条语句,并返回第二个值 (如果所有的值都为true,则返回的是最后一个值)。
290
268
291
269
292
- ** 或运算** 的返回结果:(以两个非布尔值的运算为例 )
270
+ ** 或运算** 的返回结果:(以多个非布尔值的运算为例 )
293
271
294
- - 如果第一个值为true,则直接返回第一个值 ;不会再往后执行。
272
+ - 如果第一个值为true,则执行第一条语句,并直接返回第一个值 ;不会再往后执行。
295
273
296
- - 如果第一个值为false,则返回第二个值 ((如果所有的值都为false,则返回的是最后一个值)。
274
+ - 如果第一个值为false,则继续执行第二条语句,并返回第二个值 ((如果所有的值都为false,则返回的是最后一个值)。
297
275
298
276
299
277
实际开发中,我们经常是这样来做「容错处理」的:
300
278
301
- 当成功调用一个接口后 ,返回的数据为 result 对象。这个时候,我们用变量 a 来接收 result 里的图片资源。通常的写法是这样的:
279
+ 当前端成功调用一个接口后 ,返回的数据为 result 对象。这个时候,我们用变量 a 来接收 result 里的图片资源。通常的写法是这样的:
302
280
303
281
304
282
``` javascript
@@ -309,6 +287,69 @@ if (result.resultCode == 0) {
309
287
310
288
上方代码的意思是,获取返回结果中的` result.data.imgUrl ` 这个图片资源;如果返回结果中没有 ` result.data.imgUrl ` 这个字段,就用 ` http://img.smyhvae.com/20160401_01.jpg ` 作为** 兜底** 图片。这种写法,在实际开发中经常用到。
311
289
290
+ ### 非布尔值的 ` ! ` 运算
291
+
292
+ 非布尔值进行** 与或运算** 时,会先将其转换为布尔值,然后再运算,但返回结果是** 布尔值** 。
293
+
294
+ 举例:
295
+
296
+ ``` javascript
297
+ let a = 10 ;
298
+ a = ! a
299
+
300
+ console .log (a); // false
301
+ console .log (typeof a); // boolean
302
+ ```
303
+
304
+ ### 短路运算的妙用【重要】
305
+
306
+ > 下方举例中的写法技巧,在实际开发中,经常用到。这种写法,是一种很好的「容错、容灾、降级」方案,需要多看几遍。
307
+
308
+ 1、JS中的` && ` 属于** 短路** 的与:
309
+
310
+ - 如果第一个值为false,则不会执行后面的内容。
311
+
312
+ - 如果第一个值为 true,则继续执行第二条语句,并返回第二个值。
313
+
314
+ 举例:
315
+
316
+ ``` javascript
317
+ const a1 = ' qianguyihao' ;
318
+ // 第一个值为true,会继续执行后面的内容
319
+ a1 && alert (' 看 a1 出不出来' ); // 可以弹出 alert 框
320
+
321
+ const a2 = undefined ;
322
+ // 第一个值为false,不会继续执行后面的内容
323
+ a2 && alert (' 看 a2 出不出来' ); // 不会弹出 alert 框
324
+ ```
325
+
326
+
327
+
328
+ 2、JS中的` || ` 属于** 短路** 的或:
329
+
330
+ - 如果第一个值为true,则不会执行后面的内容。
331
+
332
+ - 如果第一个值为 false,则继续执行第二条语句,并返回第二个值。
333
+
334
+ 举例:
335
+
336
+ ``` js
337
+ const result ; // 请求接口时,后台返回的内容
338
+ let errorMsg = ' ' ; // 前端的文案提示
339
+
340
+ if (result && result .retCode != 0 ) {
341
+ // 接口返回异常码时
342
+ errorMsg = result .msg || ' 活动太火爆,请稍后再试' ; // 文案提示信息,优先用 接口返回的msg字段,其次用 '活动太火爆,请稍后再试' 这个文案兜底。
343
+ }
344
+
345
+ if (! result) {
346
+ // 接口挂掉时
347
+ errorMsg = ' 网络异常,请稍后再试' ;
348
+ }
349
+ ```
350
+
351
+
352
+
312
353
## 赋值运算符
313
354
314
355
可以将符号右侧的值赋值给符号左侧的变量。
@@ -376,7 +417,7 @@ console.log(true > false); //true
376
417
377
418
比较字符编码时,是一位一位进行比较。如果两位一样,则比较下一位。
378
419
379
- 比如说,当你尝试去比较` "123" ` 和` "56" ` 这两个字符串时,你会发现,字符串"56"竟然比字符串"123"要大。也就是说,下面这样代码的打印结果,其实是true:(这个我们一定要注意,在日常开发中,很容易忽视)
420
+ 比如说,当你尝试去比较` "123" ` 和` "56" ` 这两个字符串时,你会发现,字符串"56"竟然比字符串"123"要大(因为 5 比 1 大) 。也就是说,下面这样代码的打印结果,其实是true:(这个我们一定要注意,在日常开发中,很容易忽视)
380
421
381
422
``` javascript
382
423
// 比较两个字符串时,比较的是字符串的字符编码,所以可能会得到不可预期的结果
@@ -560,7 +601,7 @@ PS:我们知道,Unicode编码采用的是16进制,但是,这里的编码
560
601
561
602
## 我的公众号
562
603
563
- 想学习** 代码之外的技能** ?不妨关注我的微信公众号:** 千古壹号** (id: ` qianguyihao ` ) 。
604
+ 想学习** 代码之外的技能** ?不妨关注我的微信公众号:** 千古壹号** 。
564
605
565
606
扫一扫,你将发现另一个全新的世界,而这将是一场美丽的意外:
566
607
0 commit comments