ES筆記—基礎之操作符篇

描述:用于操作數據值的操作符,包括算術操作符(如加號和減號)、位操作符、關系操作符和相等操作符。

1、一元操作符

描述:只能操作一個值的操作符叫做一元操作符。

遞增和遞減操作符

// 前置
var age = 29;
var anotherAge = --age + 2;
console.log(age); // 輸出 28
console.log(anotherAge); // 輸出 30
// 后置
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 等于 22
var num4 = num1 + num2; // 等于 21

一元加和減操作符主要用于基本的算術運算,也可以用于轉換數據類型。

var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
  valueOf: function() {
    return -1;
  }
};
s1 = -s1; // 值變成了數值-1
s2 = -s2; // 值變成了數值-1.1
s3 = -s3; // 值變成了 NaN
b = -b; // 值變成了數值 0
f = -f; // 變成了-1.1
o = -o; // 值變成了數值 1
2、布爾操作符

描述:共有 3 個:非(NOT)、與(AND)和或(OR)
2.1 、邏輯非操作符由一個嘆號(!)表示,可以應用于 ECMAScript 中的任何值。無論這個值是什么數據類型,這個操作符都會返回一個布爾值。邏輯非操作符首先會將它的操作數轉換為一個布爾值,然后再對其求反。邏輯非操作符遵循下列規則:

操作數是一個對象,返回 false;
操作數是一個空字符串,返回 true;
操作數是一個非空字符串,返回 false;
操作數是數值 0,返回 true;
操作數是任意非 0 數值(包括 Infinity),返回 false;
操作數是 null,返回 true;
操作數是 NaN,返回 true;
操作數是 undefined,返回 true。

console.log(!false); // true
console.log(!"blue"); // false
console.log(!0); // true
console.log(!NaN); // true
console.log(!""); // true
console.log(!12345); // false

邏輯非操作符也可以用于將一個值轉換為與其對應的布爾值。而同時使用兩個邏輯非操作符,實際上就會模擬 Boolean()轉型函數的行為。

console.log(!!"blue"); //true
console.log(!!0); //false
console.log(!!NaN); //false
console.log(!!""); //false
console.log(!!12345); //true

2.2、邏輯與操作符由兩個和號(&&)表示,有兩個操作數

邏輯與操作可以應用于任何類型的操作數,而不僅僅是布爾值。在有一個操作數不是布爾值的情況下,邏輯與操作就不一定返回布爾值;此時,它遵循下列規則:

第一個操作數是對象,則返回第二個操作數;
第二個操作數是對象,則只有在第一個操作數的求值結果為 true 的情況下才會返回該對象;
兩個操作數都是對象,則返回第二個操作數;
有一個操作數是 null,則返回 null;
有一個操作數是 NaN,則返回 NaN;
有一個操作數是 undefined,則返回 undefined。

邏輯與操作屬于短路操作,即如果第一個操作數能夠決定結果,那么就不會再對第二個操作數求值。對于邏輯與操作而言,如果第一個操作數是 false,則無論第二個操作數是什么值,結果都不再可能是true 。

var found = false;
var result = (found && someUndefinedVariable); // 不會發生錯誤
alert(result); // 會執行( "false")

2.3、邏輯或操作符由兩個豎線符號(||)表示,有兩個操作數

與邏輯與操作相似,如果有一個操作數不是布爾值,邏輯或也不一定返回布爾值;此時,它遵循下列規則:

第一個操作數是對象,則返回第一個操作數;
第一個操作數的求值結果為 false,則返回第二個操作數;
兩個操作數都是對象,則返回第一個操作數;
兩個操作數都是 null,則返回 null;
兩個操作數都是 NaN,則返回 NaN;
兩個操作數都是 undefined,則返回 undefined。

與邏輯與操作符相似,邏輯或操作符也是短路操作符。也就是說,如果第一個操作數的求值結果為
true,就不會對第二個操作數求值了

var found = true;
var result = (found || someUndefinedVariable); // 不會發生錯誤
alert(result); // 會執行( "true")
3、乘性操作符

乘性操作符:乘法、除法和求模,在操作數為非數值的情況下會執行自動的類型轉換。即參與乘性計算某個操作數不是數值,后臺會先使用 Number()轉型函數將其轉換為數值。

3.1、 乘法操作符由一個星號(*)表示,用于計算兩個數值的乘積

var result = 34 * 56;

在處理特殊值的情況下,乘法操作符遵循下列特殊的規則:

操作數都是數值,執行常規的乘法計算。乘積超過了 ECMAScript 數值的表示范圍,則返回 Infinity 或-Infinity;
有一個操作數是 NaN,則結果是 NaN;
Infinity 與 0 相乘,則結果是 NaN;
Infinity 與非 0 數值相乘,則結果是 Infinity 或-Infinity;
Infinity 與 Infinity 相乘,則結果是 Infinity;
操作數不是數值,則在后臺調用 Number()將其轉換為數值,然后再應用上面的規則。

3.2、除法操作符由一個斜線符號(/)表示,執行第二個操作數除第一個操作數的計算

var result = 66 / 11;

對特殊的值也有特殊的處理規則。這些規則如下:

操作數都是數值,執行常規的除法計算。如果商超過了 ECMAScript 數值的表示范圍,則返回 Infinity 或-Infinity;
一個操作數是 NaN,則結果是 NaN;
Infinity 被 Infinity 除,則結果是 NaN;
零被零除,則結果是 NaN;
非零的有限數被零除,則結果是 Infinity 或-Infinity;
Infinity 被任何非零數值除,則結果是 Infinity 或-Infinity;
操作數不是數值,則在后臺調用 Number()將其轉換為數值,然后再應用上面的規則。

3.3、求模(余數)操作符由一個百分號(%)表示

var result = 26 % 5; // 等于 1

求模操作符會遵循下列特殊規則來處理特殊的值:

操作數都是數值,執行常規的除法計算,返回除得的余數;
被除數是無窮大值而除數是有限大的數值,則結果是 NaN;
被除數是有限大的數值而除數是零,則結果是 NaN;
Infinity 被 Infinity 除,則結果是 NaN;
被除數是有限大的數值而除數是無窮大的數值,則結果是被除數;
被除數是零,則結果是零;
操作數不是數值,則在后臺調用 Number()將其轉換為數值,然后再應用上面的規則。

4、加性操作符

描述:加法和減法這兩個加性操作符應該說是編程語言中最簡單的算術操作符了。但是在 ECMAScript 中,這兩個操作符卻都有一系列的特殊行為。與乘性操作符類似,加性操作符也會在后臺轉換不同的數據類型。然而,對于加性操作符而言,相應的轉換規則還稍微有點復雜。

4.1、加法操作符(+)

var result = 1 + 2;

兩個操作符都是數值,執行常規的加法計算,然后根據下列規則返回結果:

有一個操作數是 NaN,則結果是 NaN;
Infinity 加 Infinity,則結果是 Infinity;
-Infinity 加-Infinity,則結果是-Infinity;
Infinity 加-Infinity,則結果是 NaN;
+0 加+0,則結果是+0;
-0 加-0,則結果是-0;
是+0 加-0,則結果是+0。

如果有一個操作數是字符串,那么就要應用如下規則:

兩個操作數都是字符串,則將第二個操作數與第一個操作數拼接起來;
只有一個操作數是字符串,則將另一個操作數轉換為字符串,然后再將兩個字符串拼接起來。
有一個操作數是對象、數值或布爾值,則調用它們的 toString()方法取得相應的字符串值,然后再應用前面關于字符串的規則。
對于 undefined 和 null,則分別調用 String()函數并取得字符串"undefined"和"null"。

var result1 = 5 + 5; // 兩個數值相加
console.log(result1); // 10
var result2 = 5 + "5"; // 一個數值和一個字符串相加
console.log(result2); // "55"

4.2、減法操作符(-)

var result = 2 - 1;

減法操作符在處理各種數據類型轉換時,同樣需要遵循一些特殊規則,如下所示:

兩個操作符都是數值,則執行常規的算術減法操作并返回結果;
有一個操作數是 NaN,則結果是 NaN;
Infinity 減 Infinity,則結果是 NaN;
-Infinity 減-Infinity,則結果是 NaN;
Infinity 減-Infinity,則結果是 Infinity;
-Infinity 減 Infinity,則結果是-Infinity;
+0 減+0,則結果是+0;
+0 減-0,則結果是-0;
-0 減-0,則結果是+0;
操作數是字符串、布爾值、 null 或 undefined,則先在后臺調用 Number()函數將其轉換為數值,然后再根據前面的規則執行減法計算。如果轉換的結果是 NaN,則減法的結果就是 NaN;
操作數是對象,則調用對象的 valueOf()方法以取得表示該對象的數值。如果得到的值是 NaN,則減法的結果就是 NaN。如果對象沒有 valueOf()方法,則調用其 toString()方法并將得到的字符串轉換為數值。

var result1 = 5 - true; // 4,因為 true 被轉換成了 1
var result2 = NaN - 1; // NaN
var result3 = 5 - 3; // 2
var result4 = 5 - ""; // 5,因為"" 被轉換成了 0
var result5 = 5 - "2"; // 3,因為"2"被轉換成了 2
var result6 = 5 - null; // 5,因為 null 被轉換成了 0
5、關系操作符

描述:小于(<) 、大于(>) 、小于等于(<=)和大于等于(>=)用于對兩個值進行比較。都返回一個布爾值

var result1 = 5 > 3; //true
var result2 = 5 < 3; //false

關系操作符的操作數使用了非數值時,也要進行數據轉換或完成某些奇怪的操作。以下就是相應的規則。

兩個操作數都是數值,則執行數值比較;
兩個操作數都是字符串,則比較兩個字符串對應的字符編碼值;
操作數是數值,則將另一個操作數轉換為一個數值,然后執行數值比較;
操作數是對象,則調用這個對象的 valueOf()方法,用得到的結果按照前面的規則執行比較。如果對象沒有 valueOf()方法,則調用 toString()方法,并用得到的結果根據前面的規則執行比較;
操作數是布爾值,則先將其轉換為數值,然后再執行比較;
任何操作數與 NaN 進行關系比較,結果都是 false。

6、相等操作符

描述:確定兩個變量是否相等是編程中的一個非常重要的操作。涉及到對象的比較時,問題就變得復雜了。最早的 ECMAScript 中的相等和不等操作符會在執行比較之前,先將對象轉換成相似的類型。后來,有人提出了這種轉換到底是否合理的質疑。最后, ECMAScript 的解決方案就是提供兩組操作符: 相等和不相等——先轉換再比較, 全等和不全等——僅比較而不轉換。

6.1、相等操作符由兩個等于號(==)表示,如果兩個操作數相等,則返回 true。而不相等操作符由嘆號后跟等于號(!=)表示,如果兩個操作數不相等,則返回 true。這兩個操作符都會先轉換操作數(通常稱為強制轉型),然后再比較它們的相等性。

在轉換不同的數據類型時,相等和不相等操作符遵循下列基本規則:

有一個操作數是布爾值,則在比較相等性之前先將其轉換為數值——false 轉換為 0,而true 轉換為 1;
一個操作數是字符串,另一個操作數是數值,在比較相等性之前先將字符串轉換為數值;
一個操作數是對象,另一個操作數不是,則調用對象的 valueOf()方法,用得到的基本類型值按照前面的規則進行比較;
null 和 undefined 是相等的;
要比較相等性之前,不能將 null 和 undefined 轉換成其他任何值;
有一個操作數是 NaN,則相等操作符返回 false,而不相等操作符返回 true。重要提示:即使兩個操作數都是 NaN,相等操作符也返回 false;因為按照規則, NaN 不等于 NaN。
兩個操作數都是對象,則比較它們是不是同一個對象。如果兩個操作數都指向同一個對象,則相等操作符返回 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 // true
"5"==5 // true
false == 0 // true

6.2、全等操作符由 3 個等于號(===)表示,它只在兩個操作數未經轉換就相等的情況下返回 true。不全等操作符由一個嘆號后跟兩個等于號(!==)表示,它在兩個操作數未經轉換就不相等的情況下返回 true。

var result1 = ("55" == 55); //true,因為轉換后相等
var result2 = ("55" === 55); //false,因為不同的數據類型不相等
var result1 = ("55" != 55); //false,因為轉換后相等
var result2 = ("55" !== 55); //true,因為不同的數據類型不相等
7、條件操作符

條件操作符應該算是 ECMAScript 中最靈活的一種操作符了,而且它遵循與 Java 中的條件操作符相同的語法形式,如下面的例子所示:variable = boolean_expression ? true_value : false_value

var max = (num1 > num2) ? num1 : num2;
8、賦值操作符

簡單的賦值操作符由等于號(=)表示,其作用就是把右側的值賦給左側的變量,在等于號(=)前面再添加乘性操作符、加性操作符或位操作符,就可以完成復合賦值操作。

var num = 10;
num += 10;
9、逗號操作符

描述:使用逗號操作符可以在一條語句中執行多個操作。

var num1=1, num2=2, num3=3;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容