成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

&& ,|| 超越了我的認知

開發 前端
這節課程主要學習 JavaScript 中的 && 、||、! 和 !!,如果使用不當可能會引發bug。下面,我們一起來看。

[[314118]]

今天的課程誕生于一個 bug,有一段代碼:

  1. const person = { 
  2.     name: 'suyan', 
  3.     getName() { 
  4.         return this.name; 
  5.     } 
  6. }; 
  7.  
  8. function isSuyan()  
  9.     if (person.name === 'suyan' && person.getName) { 
  10.         return true; 
  11.     } 
  12.     return false; 

隨手對這段代碼進行了重構:

  1. function isSuyan()  
  2.     return person.name === 'suyan' && person.getName; 

執行下面打的代碼,結果是什么?

  1. let isTrue = isSuyan(); 
  2. console.log(isTrue); 

結果是一個函數,可能出乎你我的意料:

遇到問題立馬在百度一下:

看到一段解釋:

Logical operators are typically used with Boolean (logical) values. When they are, they return a Boolean value. However, the && and || operators actually return the value of one of the specified operands, so if these operators are used with non-Boolean values, they will return a non-Boolean value.

意思:邏輯運算符如果使用的都是布爾值,則結果也是布爾值。然而,在 && 和 || 中, 當操作數是非布爾值的時候結果可能是非布爾值。

理解起來有點繞開,看個例子:

&& 運算符從左到右進行計算,如果為真,繼續往后走,直到遇到為 false 的,或者到了最后一個操作數。如果操作數是布爾值結果返回布爾值,如果操作數是非布爾值結果返回非布爾值。

  1. const a = 10
  2. const b = -5; 
  3. const c = 1
  4. console.log(a && b); // -5 
  5. console.log(a > 0 && b); // -5 
  6. console.log(a < 0 && b); // false 
  7. console.log(a && b < 0); // true 
  8. console.log(a && b > 0); // false 
  9. console.log(a > 0 && b < 0); // true 
  10. console.log(a && b && c); // 1 

|| 運算符,只要遇到一個真值便停止計算,結果的規則和 && 運算符一致。

  1. console.log(a || b); // 10 
  2. console.log(a > 0 || b); // true 
  3. console.log(a < 0 || b); // -5 
  4. console.log(a || b < 0); // 10 
  5. console.log(a || b > 0); // 10 
  6. console.log(a > 0 || b < 0); // true 
  7. console.log(a || b || c); // 10 

擴散幾個知識點:

1.可以被轉換成 false 的值:null、NaN、0、空字符串 "", '',``、undefined。

2.&& 的優先級大于 || 的優先級。

  1. true || false && false      // returns true, because && is executed first 
  2. (true || false) && false    // returns false, because operator precedence cannot apply 

3.!和 !! 操作符返回的值永遠是布爾值,上面的例子可以改為下面這樣,返回值永遠是布爾值:

  1. function isSuyan() { 
  2.     return !!(person.name === 'suyan' && person.getName); 

4. 優先級

假如有個 Label 顯示用戶的名稱,顯示規則為:默認值是前端小課,如果用戶定義了別名就用別名,如果用戶定義了真實的名字就用真實的名字,優先級為真實名字 > 昵稱 > 默認名字。我以前這樣寫:

  1. function showName() { 
  2.     let showName; 
  3.     let trueName = '真名'
  4.     let nickName = '別名'
  5.     if (trueName) { 
  6.         showName = trueName
  7.     } 
  8.     else if (nickName) { 
  9.         showName = nickName
  10.     } 
  11.     else { 
  12.         showName = '前端小課'
  13.     } 
  14.     return showName; 

學完這節課程我這樣寫,兩個函數的結果是一樣的,但代碼量從 15 行縮減到了 6 行:

  1. function showName2() { 
  2.     let defaultName = '前端小課'
  3.     let trueName = '真名'
  4.     let nickName = '別名'
  5.     return trueName || nickName || defaultName; 

這節課程主要學習了 JavaScript 中的 && 、||、! 和 !!,如果使用不當可能會引發bug。大家加油!!!

 

責任編輯:趙寧寧 來源: 素燕
相關推薦

2024-04-08 10:12:20

GPT4AgentAI

2019-09-03 10:59:28

SQL索引語句

2022-01-24 07:20:05

DevOps軟件開發

2019-12-04 07:39:07

MySQL索引數據庫

2020-04-03 09:45:09

Java多線程接口

2012-05-25 13:35:28

2014-06-09 11:22:31

2013-07-17 14:13:08

產品產品失敗

2022-06-13 10:53:42

Linux桌面發行版Windows

2021-01-26 13:14:14

js前端map

2024-06-11 09:20:48

2014-06-27 18:22:19

2016-03-01 09:12:35

IBM認知論壇認知IBM

2021-01-31 10:50:45

JavaC++抽象

2013-06-20 11:11:00

程序員經理

2020-08-06 16:55:37

虛擬化底層計算機

2011-05-16 14:45:47

項目經理超越

2021-04-23 11:22:57

ThreadJava進階Runnable

2020-06-12 09:07:03

技術總監數據庫

2014-05-19 10:34:35

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 伊人久久国产 | 911精品美国片911久久久 | 久久精品久久久久久 | 精品日韩在线 | 欧美日韩国产一区二区 | 亚洲 中文 欧美 日韩 在线观看 | 成人av免费在线观看 | 最新中文字幕在线 | 欧美激情久久久 | 成人精品视频在线观看 | 日日夜夜天天干 | 亚洲永久免费 | 日本三级网站在线观看 | www亚洲精品 | 亚洲黄色网址视频 | 91av在线视频观看 | 精彩视频一区二区三区 | 99在线精品视频 | 国产一区二区三区四区 | 999久久久久久久久 国产欧美在线观看 | 亚洲成人免费电影 | 国产区精品在线观看 | 欧美成人精品一区二区三区 | 亚洲综合三区 | 日韩一区二区av | 久久久www成人免费精品 | a级片在线观看 | 亚洲精品自在在线观看 | 久久国产成人午夜av影院武则天 | 国产情侣啪啪 | 欧美二区在线 | 亚洲成人国产综合 | 日韩av在线一区 | 欧美精品区 | 国产欧美在线 | 黄视频网站在线 | 午夜爽爽爽男女免费观看 | 亚洲网视频 | 亚洲精品女优 | 91视频在线观看 | 日韩久久综合网 |