重學js之JavaScript基本概念(下)=> 運算符

注意: 本文章爲 《重學js之JavaScript高級程序設計》系列第三章第三部分【運算符】。

關於《重學js之JavaScript高級程序設計》是從新回顧js基礎的學習。

1. 布爾操做符

布爾操做符的重要性堪比相等操做符。布爾操做符一個有3個,非(NOT)、與(AND)、或(OR)前端

1.1 邏輯非

邏輯非操做符由一個歎號(!)表示,能夠應用於ES中的任何值。不管這個值是什麼數據類型,這個操做符都會返回一個布爾值。邏輯非操做符首先會將它的操做數轉換爲一個布爾值,而後在對其求反,它遵循如下規則:segmentfault

1. 操做數是一個對象,返回false
2. 操做數是一個空字符串,返回true
3. 操做數是一個非空字符串,返回false
4. 操做數是數值0,返回true
5. 操做數是任意非0數值,返回false
6. 操做數是null,返回true
7. 操做數是NaN,返回true
8. 操做數是undefined,返回true
複製代碼

注意:邏輯非也能夠用於將一個值轉化爲與其對應的布爾值。而同時使用兩個邏輯非操做符,實際上會模擬Boolean()轉型函數的行爲。其中,第一個邏輯非操做符會基於不管什麼操做數返回一個布爾值,而第二個邏輯非操做則對該布爾值進行求反,因而就獲得這個值真正對應的布爾值。數組

!!'blue'    // true
!!0     //  false
!!NaN   //  false
!!''    //  false
!!123   //  true
複製代碼

1.2 邏輯與

邏輯與操做符由兩個和號(&&)表示,有兩個操做數,只有兩個操做符都爲true的時候,結果才爲true,其餘都爲 false 。以下:函數

操做數 1 操做數 2 結果
true true true
true false false
false true false
false false false

一樣,邏輯與操做能夠用於任何類型的操做數,而不只僅是布爾值。在有一個操做不是布爾值的狀況下,邏輯與操做就不必定返回布爾值,此時遵循以下規則:post

1. 第一個操做數是對象,則返回第二個操做數
2. 第二個操做數是對象,則只有在第一個操做數
的求值結果爲true的狀況下才會返回該對象
3. 兩個操做數都是對象,則返回第二個操做數
4. 有一個操做數是null,則返回null
5. 有一個操做數是NaN,  則返回NaN
6. 有一個操做數是undefined,則返回undefined
複製代碼

**注意:**邏輯與屬於短路操做,即若是第一個操做數可以決定結果,那麼就不會在對第二個操做數求值,對於邏輯與操做來講。若是第一個操做數是false,那麼不管第二個操做數是什麼值,結果也不多是true了。另外重要的一點:不能在邏輯與操做中使用未定義的變量,會形成報錯。性能

1.3 邏輯或

邏輯或操做符由兩個豎線符號(||)表示,有兩個操做數,與邏輯與相反,兩個操做數只要有個爲ture,結果就爲true,以下:學習

操做數 1 操做數 2 結果
true true true
true false true
false true true
false false false

與邏輯與類似,若是有一個操做數不是布爾值,邏輯或也不必定返回布爾值,遵循以下下規則測試

1. 第一個操做數是對象,則返回第一個操做數
2. 第一個操做數的求值結果爲false,則返回第二個操做數
3. 兩個操做數都是對象,則返回第一個操做數
4. 兩個操做數都是null,則返回null
5. 兩個操做數都是NaN,則返回NaN
6. 兩個操做數都是undefined,則返回undefined
複製代碼

**注意:**與邏輯與操做符類似,邏輯非操做符也是短路操做符,也就是說,若是第一個操做符的求值結果爲 true,那麼就不會在區對第二個操做數求值,結果就爲 true。編碼

2. 乘性操做符

ES 定義了3個乘性操做符:乘法、除法、求模。在操做符爲非數值的狀況下會自動執行類型轉換。若是參與乘法計算的某個操做數不是數值,後臺會使用 Number() 轉型函數將其轉換爲數值,空字符會被當作 0,布爾值 true會被當作1.spa

2.1 乘法

乘法操做符(*)表示,用於計算兩個數值的乘積。 以下:

var result = 43 * 22
複製代碼

**注意:**處理特殊值的狀況下,乘法操做遵循如下規則:

1. 操做數都是數值,按照常規執行,若是兩個正數或負數
結果仍是正數,若是一正一負則是負數。若是值超過ES的表
示範圍,則用 Infinity 或 - Infinity
2. 一個操做數爲NaN,結果爲NaN
3. Infinity 與 0 相乘,結果爲NaN
4. Infinity 與 非0相乘,結果爲Infinity 或 - Infinity
5. Infinity * Infinity,結果爲Infinity
6. 若是有一個操做符不是數值,則調用Number()進行轉換
複製代碼

2.2 除法

除法操做符由一個斜線符號(/)表示,執行第二個操做數除第一個操做數的計算。以下:

var result 44 / 33
複製代碼

注意: 和乘法相似,處理特殊值的狀況以下:

1. 操做數都是數值,按照常規執行,若是兩個正數或負數
結果仍是正數,若是一正一負則是負數。若是值超過ES的表
示範圍,則用 Infinity 或 - Infinity
2. 一個操做數爲NaN,結果爲NaN
3. 0 / 0 ,結果爲NaN
4. Infinity 被任意值除,結果爲Infinity
5. Infinity / Infinity,結果爲 NaN
6. 若是有一個操做符不是數值,則調用Number()進行轉換
7. 若是是 非0 的有限數被0除,結果是Infinity 或 - Infinity
8. 若是是 Infinity被任何 非0值除,結果是Infinity 或 - Infinity
複製代碼

2.3 求模

求模(餘數)操做符由一個百分號(%)表示,以下:

var result = 33 % 2
複製代碼

**注意:**規則以下:

1. 操做數都是數值,執行常規的除法計算,返回除的餘數
2. 被除數無窮大值,結果NaN
3. 被除數是有限大的數值而除數是0,則結果是NaN
4. Infinity 被 Infinity 除,結果NaN
5. 被除數是有限大的數值而除數是無窮大的數值,結果是被除數
6. 被除數是0,結果0
7. 有一個操做數不是數值,則調用Number()轉換。
複製代碼

3. 加性操做符

加法和減法是最簡單的算術操做符。

3.1 加法

var result = 1 + 2

**注意:**規則以下:

1. 有一個操做數是NaN,結果爲 NaN
2. Infinity + Infinity, 結果是 Infinity
3. -Infinity + -Infinity, 結果 -Infinity
4. Infinity + -Infinity, 結果爲 NaN
5. 0 + 0 = 0
6. -0 + -0 = -0
7.+0 + -0 = +0
8. 若是是兩個字符串,則將字符串進行拼接
9. 若是兩個有個不是字符串,則將非字符串轉換成字符串在拼接。
複製代碼

3.2 減法

var result = 1 - 2

**注意:**規則以下:

1. 有一個操做數是NaN,結果爲 NaN
2. Infinity - Infinity, 結果是 NaN
3. -Infinity - -Infinity, 結果 NaN
4. Infinity - -Infinity, 結果爲 Infinity
5. -Infinity - Infinity, 結果爲 -Infinity
6. 0 - 0 = 0
7. -0 - -0 = +0
8. +0 - -0 = -0
9. 若是有一個操做數是字符串、布爾值等則調用number()
進行轉換爲數值,在操做。
10. 若是一個操做數是對象,則調用valueOf()取得該對象
的值,在計算。若是沒有valueOf()方法則調用toString()在計算。
複製代碼

4. 關係操做符

小於(<),大於(>),小於等於(<=),大於等於(>=)這幾個關係操做符用於對兩個值進行比較,比較規則和數學上同樣。都返回布爾值。若是使用非數值,會進行數值轉換,規則以下:

1. 兩個操做數都是數值,則執行數值比較
2. 兩個操做數都是字符串, 則比較兩個字符串對應的字符編碼
3. 一個操做數是數值,則將另一個操做數轉換爲數值,在比較
4. 一個操做數是對象,則調用這個對象的valueOf()方法,在執行
以前的操做,若是沒有這個方法在調用toString()方法。
5. 若是一個操做數是布爾值,則先將其轉換爲數值,在執行比較
複製代碼

**注意:**在比較兩個字符串的時候,不是比較字符串中字母在字母表的位置,而是比較當前字母的ASCII碼的大小。

5. 相等操做符

肯定兩個變量是否相等的關鍵操做。若是涉及到對象的比較,則先將對象轉換成類似的類型。有兩種方案 一 相等和不相等,先轉換在比較,全等和不全等,僅比較不轉換。

5.1 相等和不相等

由符號 (==)表示,若是兩個操做數相等,則返回true,不等由符號(!=)表示,不相等的時候返回 true。這兩個操做符都回轉轉換操做數在比較。是強制轉換。規則以下:

1. 一個操做數是布爾值,比較以前先將其轉換
成數值,false爲0,true爲1
2. 一個操做數是字符串,另外一個不是,則調用
對象的valueOf()方法,在進行比較
3. 一個操做數是字符串,另外一個操做數是數值,
則將字符串轉換爲數值在比較
4. null == undefined
5. 比較以前不能將null和undefined轉換成其餘值。
6. 一個操做數是NaN,則相等返回false,不相等
返回true。若是兩個操做數都是NaN, 也是返回false,
由於 NaN != NaN
7. 兩個操做數都是對象,則比較是否是同一個對象,
若是是則返回true不然false
複製代碼
表達式 表達式
null == undefined true true == 1 true
'NaN' == NaN false true == 2 false
5 == NaN false undefined == 0 false
NaN == NaN false null == 0 false
NaN != NaN false '5' == 5 true
false == 0 true

5.2 全等和不全等

和相等不相等的區別就是比較以前不轉換操做數,符號(===)它只有在兩個操做數未經轉換就相等的狀況下返回 true,而(!==)不等於則是兩個操做數在未經轉換就不相等的狀況下返回ture

// 全等
var result1 = ('55' == 55)  // true
var result2 = ('55' === 55) // false

// 不全等
var result1 = ('55 != 55)  // false
var result2 = ('55' !== 55) // true
複製代碼

建議:因爲相等和不相等操做符存在類型轉換問題,因此爲了保證代碼數據類型的完整,推薦使用全等和不全等。

6. 條件操做符

a = b ? c : d

// 若是b的值是true 那麼 a = c 不然 a = d
複製代碼

7. 賦值操做符

簡單的賦值操做符就是由(=)表示,做用就是把右側的值賦給左側的變量

var a = 10

// 若是在 = 的前面加上其餘操做符就變成複合賦值操做

var a = 10
a = a + 10 === a += 10

// 複合賦值

(*=)乘
(/=)除
(%=)取模
(+=)加
(-=)減
(<<=)左移賦值
(>>=)有符號右移賦值
(>>>=)無符號右移賦值
複製代碼

8. 逗號操做符

var num = 1, a = 2, c =3;
複製代碼

9. 語句

語句就是使用一或多個關鍵字來完成給定任務。

9.1 if 語句

給定執行條件,若是條件符合則執行 if 內的代碼塊,不然執行 else 中的代碼塊。

var i = 10
if (i > 9) {
    // i > 9 執行這裏
} else {
    // 不然執行這裏
}
複製代碼

9.2 do-while 語句

一種後測試循環語句,即只有在循環體中的代碼執行後,纔會測試出口條件,也就是說條件表達式求值以前循環體的代碼至少會被執行一次。

var i = 0;
do{
    i += 2
} while(i < 10)
複製代碼

9.3 while 語句

屬於前測試循環語句,循環內的代碼被執行以前,就會對出口條件求值。所以循環體的代碼可能永遠不會被執行;

var i = 0;
while (i < 10) {
    i += 2
}
複製代碼

9.4 for語句

也是一種前測試循環語句,但它具備在執行循環以前初始化變量和定義循環後要執行代碼的能力。

var count = 10
for (var i = 0; i< count; i++) {
    alert(i)
}
複製代碼

9.5 for-in 語句

是一種精準的迭代語句,能夠用來枚舉對象的屬性,以下:

for (var a in b) {
    alert(a)
}

// 由於ES對象的屬性沒有順序,因此經過
for-in輸出的屬性名順序也是不可預測的
複製代碼

9.6 label語句

使用label語句能夠在代碼中添加標籤

label : a

s: for (var i = 0; i < c; i++) {
    alert(i)
}
複製代碼

9.7 break 和 countinue

用於程序在循環中精確地控制代碼執行,break會當即推出循環,強制執行循環後面的語句,而countinue雖然也是當即退出循環,可是會從循環的頂部繼續執行。

9.8 with語句

將代碼的做用域設置到一個特定的對象中,大量使用with語句會致使性能降低,致使調試困難。

var b = a.c
var d = a.d
var u = a.t

with(a){
    var b = c
    var d = d
    var u = t
}
複製代碼

9.9 switch語句

流式控制語句,避免寫過多的if else 判斷。

var i = 2
switch (i) {
    case 2:
        alert(i)
        break;
}
複製代碼

10. 函數

經過函數能夠封裝任意多條語句,並且能夠任何地方調用執行。 經過 function來聲明,後面跟一組參數以及函數體

function a (b,c){
    alert(b + c)
}

a(2,4)
複製代碼

注意: 函數要麼始終都返回一個值,要麼始終都不返回。

11. 參數

ES中函數不介意傳遞多少個參數,也不在乎參數的類型。由於在ES的參數在內部是用一個數組來表示,它不會關心這個數組包含什麼參數。這個數組也能夠爲空。在函數體內能夠經過 arguments對象來訪問這個參數數組。從而得到傳遞給函數的每個參數。

ES 中 全部的參數傳遞的都是值,不可能經過引用傳遞參數。

12. 沒有重載

ES 函數不能像傳統意義上那樣實現重載,由於ES函數沒用簽名,其餐宿是由包含零或多個值的數組來表示的,沒用函數簽名,則真正的重載是不可能作到的。

13. 小結

  1. ES的基本數據類型包括 Undefined 、 Null 、Boolean、Number、String
  2. ES中沒用爲整數和浮點數分別定義不一樣的數據類型,Number類型可用於表示全部數值。
  3. ES也有複雜的數據類型,Object類型,該類型是全部對象的基礎類型。
  4. ES提供了 算術操做符、布爾操做符、關係操做符、相等操做符、賦值操做符等
  5. ES提供了流控制語句,如 if語句 for語句 switch語句等。
  6. 無須指定函數的返回值,由於任何ES函數均可以在任什麼時候候返回任何返回值
  7. 未指定返回值的函數返回的是一個特殊的undefined值,ES中沒用函數簽名的概念,由於函數參數是以一個包含零或多個值的數組的形式傳遞的。
  8. 能夠向函數傳遞任意數量的參數,而且能夠經過 argument 對象來訪問這些參數
  9. 函數不能重載

歡迎關注 公衆號【小夭同窗】

重學js系列

重學js之JavaScript簡介

重學 JS 之在 HTML 中使用 JavaScript

重學js之JavaScript基本概念(上)=> 數據類型

重學js之JavaScript基本概念(中)=> 操做符

ES6入門系列

ES6入門之let、cont

ES6入門之變量的解構賦值

ES6入門之字符串的擴展

ES6入門之正則的擴展

ES6入門之數值的擴展

ES6入門之函數的擴展

ES6入門之數組的擴展

ES6入門之對象的擴展

ES6入門之Symbol

Git教程

前端Git基礎教程

相關文章
相關標籤/搜索