運(yùn)算符基本概念
- JavaScript運(yùn)算符的概念和C語言一樣, 都是告訴程序執(zhí)行特定算術(shù)或邏輯操作的符號(hào)。
運(yùn)算符分類
JavaScript運(yùn)算符的分類和C語言也一樣
-
按照功能劃分:
- 算術(shù)運(yùn)算符
- 位運(yùn)算符
- 關(guān)系運(yùn)算符
- 邏輯運(yùn)算符
-
運(yùn)算符根據(jù)參與運(yùn)算的操作數(shù)的個(gè)數(shù)分為
- 單目運(yùn)算
- 雙目運(yùn)算
- 三目運(yùn)算
運(yùn)算符的優(yōu)先級(jí)和結(jié)合性
- 優(yōu)先級(jí)
- JavaScript運(yùn)算符的優(yōu)先級(jí)和C語言也一樣
- JavaScript中,運(yùn)算符的運(yùn)算優(yōu)先級(jí)共分為15 級(jí)。1 級(jí)最高,15 級(jí)最低。
- 在表達(dá)式中,優(yōu)先級(jí)較高的先于優(yōu)先級(jí)較低的進(jìn)行運(yùn)算。
- 在一個(gè)運(yùn)算量兩側(cè)的運(yùn)算符優(yōu)先級(jí)相同時(shí),則按運(yùn)算符的結(jié)合性所規(guī)定的結(jié)合方向處理
| 運(yùn)算符 | 描述 |
|---|---|
| () | 表達(dá)式分組 |
| ++ -- - ~ ! | 一元運(yùn)算符 |
| * / % | 乘法、除法、取模 |
| + - + | 加法、減法、字符串連接 |
| << >> >>> | 移位 |
| < <= > >= | 小于、小于等于、大于、大于等于 |
| == != === !== | 等于、不等于、嚴(yán)格相等、非嚴(yán)格相等 |
| & | 按位與 |
| ^ | 按位異或 |
| | | 按位或 |
| && | 邏輯與 |
| || | 邏輯或 |
| ?: | 條件 |
| = += -= *= /= %= | 賦值運(yùn)算 |
| , | 多重求值 |
- 結(jié)合性
- JavaScript運(yùn)算符的結(jié)合性和C語言也一樣
- 即左結(jié)合性(自左至右)和右結(jié)合性(自右至左)。
算術(shù)運(yùn)算符
- JavaScript算術(shù)運(yùn)算符和C語言也一樣
| 名稱 | 符號(hào) | 說明 |
|---|---|---|
| 加法運(yùn)算符 | + | 對(duì)兩個(gè)值進(jìn)行加法運(yùn)算,并將結(jié)果返回 |
| 減法運(yùn)算符 | - | 對(duì)兩個(gè)值進(jìn)行減法運(yùn)算,并將結(jié)果返回 |
| 乘法運(yùn)算符 | * | 對(duì)兩個(gè)值進(jìn)行乘法運(yùn)算,并將結(jié)果返回 |
| 除法運(yùn)算符 | / | 對(duì)兩個(gè)值進(jìn)行除法運(yùn)算,并將結(jié)果返回 |
| 求余運(yùn)算符 (模運(yùn)算符) | % | 對(duì)兩個(gè)值進(jìn)行取余運(yùn)算,并將結(jié)果返回 |
- 基本使用和C語言一模一樣
var res1 = 1 + 1; var res2 = 1 - 1; var res3 = 2 * 2; var res4 = 10 / 3; var res5 = 10 % 3; console.log(res1); // 1 console.log(res2); // 0 console.log(res3); // 4 console.log(res4); // 3.3333 console.log(res5); // 1
- 注意點(diǎn):
-
和C語言不同的是JavaScript中整數(shù)除以整數(shù)結(jié)果是小數(shù)
var res4 = 10 / 3; console.log(res4); // 3.3333 -
任何值和NaN做運(yùn)算都得NaN
var result = 2 + NaN; console.log(result); //NaN -
非Number類型的值進(jìn)行運(yùn)算時(shí),會(huì)將這些值轉(zhuǎn)換為Number然后在運(yùn)算
var result = true + 1; // + - * / % console.log(result); // 2 result = true + false; console.log(result); // 1 result = 2 + null; console.log(result);// 2 -
任何的值和字符串做加法運(yùn)算,都會(huì)先轉(zhuǎn)換為字符串,然后再和字符串做拼串的操作
var result = 1 + "123"; console.log(result); // 1123 result = 2 + "true"; console.log(result); // 2true -
任何的值和字符串做- * / %法運(yùn)算, 都會(huì)先轉(zhuǎn)換為字符串轉(zhuǎn)換為Number
var result = 2 - "1"; // - * / % console.log(result); // 1 result = "2" - "1"; console.log(result); // 1 -
取余運(yùn)算m%n, n等于0 返回NaN, 其它和C語言一樣
var result = 10 % 0; console.log(result); // NaN
-
正負(fù)運(yùn)算符
- 正號(hào)
- + 正號(hào)不會(huì)對(duì)數(shù)字產(chǎn)生任何影響
var num = 123; num = +num; console.log(num); // 123 - 對(duì)于非Number類型的值,會(huì)將先轉(zhuǎn)換為Number,然后再運(yùn)算
var bool = true; var res = +bool; console.log(res); // 1 var str = "123"; res = +str; console.log(res); // 123 var str2 = "123abc"; res = +str2; console.log(res); // NaN, 所以內(nèi)部不是調(diào)用parseInt, 而是Number()函數(shù) var temp = null; res = +temp; console.log(res); // 0
- 負(fù)號(hào)
- - 負(fù)號(hào)可以對(duì)數(shù)字進(jìn)行負(fù)號(hào)的取反
var num = 123; num = -num; console.log(num); // -123
- - 負(fù)號(hào)可以對(duì)數(shù)字進(jìn)行負(fù)號(hào)的取反
賦值運(yùn)算符
- JavaScript賦值運(yùn)算符和C語言也一樣
| 優(yōu)先級(jí) | 名稱 | 符號(hào) | 說明 |
|---|---|---|---|
| 14 | 賦值運(yùn)算符 | = | 雙目運(yùn)算符,具有右結(jié)合性 |
| 14 | 除后賦值運(yùn)算符 | /= | 雙目運(yùn)算符,具有右結(jié)合性 |
| 14 | 乘后賦值運(yùn)算符 (模運(yùn)算符) | *= | 雙目運(yùn)算符,具有右結(jié)合性 |
| 14 | 取模后賦值運(yùn)算符 | %= | 雙目運(yùn)算符,具有右結(jié)合性 |
| 14 | 加后賦值運(yùn)算符 | += | 雙目運(yùn)算符,具有右結(jié)合性 |
| 14 | 減后賦值運(yùn)算符 | -= | 雙目運(yùn)算符,具有右結(jié)合性 |
自增自減運(yùn)算符
- JavaScript自增自減運(yùn)算符和C語言也一樣
| 優(yōu)先級(jí) | 名稱 | 符號(hào) | 說明 |
|---|---|---|---|
| 2 | 自增運(yùn)算符(在后) | i++ | 單目運(yùn)算符,具有左結(jié)合性 |
| 2 | 自增運(yùn)算符(在前) | ++i | 單目運(yùn)算符,具有右結(jié)合性 |
| 2 | 自減運(yùn)算符(在后) | i-- | 單目運(yùn)算符,具有左結(jié)合性 |
| 2 | 自減運(yùn)算符(在前) | --i | 單目運(yùn)算符,具有右結(jié)合性 |
關(guān)系運(yùn)算符
- JavaScript關(guān)系運(yùn)算符和C語言也一樣
- 和C語言不同的是, JavaScript中的關(guān)系運(yùn)算符只會(huì)返回true或false
| 優(yōu)先級(jí) | 名稱 | 符號(hào) | 說明 |
|---|---|---|---|
| 6 | 大于運(yùn)算符 | > | 雙目運(yùn)算符,具有左結(jié)合性 |
| 6 | 小于運(yùn)算符 | < | 雙目運(yùn)算符,具有左結(jié)合性 |
| 6 | 大于等于運(yùn)算符 | >= | 雙目運(yùn)算符,具有左結(jié)合性 |
| 6 | 小于等于運(yùn)算符 | <= | 雙目運(yùn)算符,具有左結(jié)合性 |
| 7 | 等于運(yùn)算符 | == | 雙目運(yùn)算符,具有左結(jié)合性 |
| 7 | 不等于運(yùn)算符 | != | 雙目運(yùn)算符,具有左結(jié)合性 |
| 7 | 不等于運(yùn)算符 | === | 雙目運(yùn)算符,具有左結(jié)合性 |
| 7 | 不等于運(yùn)算符 | !== | 雙目運(yùn)算符,具有左結(jié)合性 |
- 注意點(diǎn):
- 對(duì)于非數(shù)值進(jìn)行比較時(shí),會(huì)將其轉(zhuǎn)換為數(shù)字然后在比較
console.log(1 > true); //false console.log(1 > false); //true console.log(1 > "0"); //true console.log(1 > null); //true - 如果符號(hào)兩側(cè)的值都是字符串時(shí),不會(huì)將其轉(zhuǎn)換為數(shù)字進(jìn)行比較, 而會(huì)分別比較字符串中字符的Unicode編碼
-
Unicode編碼轉(zhuǎn)換地址
// a的Unicode編碼是:0061 // b的Unicode編碼是:0062 console.log("a" < "b");//true // 比較多位時(shí)則是從前往后一位一位比較 // 第一位相同比較第二位, 直到比較到不一樣或者結(jié)束為止 // c的Unicode編碼是:0063 // 類似于C語言strcmp函數(shù), 只不過JavaScript中比較的是Unicode編碼 console.log("ab" < "ac");//true - null、undefined 、NaN比較
console.log(null == 0); // false console.log(undefined == 0); // false // 永遠(yuǎn)不要判斷兩個(gè)NaN是否相等 console.log(NaN == NaN); // false /* * 可以通過isNaN()函數(shù)來判斷一個(gè)值是否是NaN * 如果該值是NaN則返回true,否則返回false */ var num = NaN; console.log(isNaN(num)); // true // undefined 衍生自 null, 所以返回true console.log(null == undefined); // true; console.log(null === undefined); // false; // == 判斷值是否相等 // == 會(huì)進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換 console.log("123" == 123); // true // === 判斷值和類型時(shí)候同時(shí)相等 // === 不會(huì)進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換 console.log("123" === 123); // false
- 對(duì)于非數(shù)值進(jìn)行比較時(shí),會(huì)將其轉(zhuǎn)換為數(shù)字然后在比較
邏輯運(yùn)算符
- JavaScript邏輯運(yùn)算符和C語言也一樣
| 優(yōu)先級(jí) | 名稱 | 符號(hào) | 說明 |
|---|---|---|---|
| 2 | 邏輯非運(yùn)算符 | ! | 單目運(yùn)算符,具有右結(jié)合性 |
| 11 | 邏輯與運(yùn)算符 | && | 雙目運(yùn)算符,具有左結(jié)合性 |
| 12 | 邏輯或運(yùn)算符 | || |
雙目運(yùn)算符,具有左結(jié)合性 |
- 注意點(diǎn):
對(duì)于非Boolean類型的數(shù)值, 邏輯運(yùn)算符會(huì)將其悄悄咪咪轉(zhuǎn)換為Boolean類型來判斷
-
邏輯與
- 如果條件A不成立, 則返回條件A的數(shù)值本身
- 如果條件A成立, 不管條件B成不成立都返回條件B數(shù)值本身
result = null && 0; console.log(result); // null var result = "123" && "abc"; console.log(result); // "abc" result = "123" && 0; console.log(result); // 0 -
邏輯或
- 如果條件A不成立, 則不管條件B成不成立都返回條件B數(shù)值本身
- 如果條件A成立, 則返回條件A的數(shù)值本身
var result = null || 0; console.log(result); // 0 result = "123" || "abc"; console.log(result); // "123" result = "123" || 0; console.log(result); // "123"
逗號(hào)運(yùn)算符
- JavaScript逗號(hào)運(yùn)算符和C語言也一樣
- 逗號(hào)運(yùn)算符會(huì)從左至右依次取出每個(gè)表達(dá)式的值, 最后整個(gè)逗號(hào)表達(dá)式的值等于最后一個(gè)表達(dá)式的值
- 格式: 表達(dá)式1,表達(dá)式2,… …,表達(dá)式n;
var a, b, c, d; /* 1.先計(jì)算表達(dá)式1, a = 2 2.再計(jì)算表達(dá)式2, b = 12 3.再計(jì)算表達(dá)式3, c = 5 4.將表達(dá)式3的結(jié)果返回給d */ d = (a = 1 + 1,b = 3 * 4, c = 10 / 2); console.log(d); // 5
三目運(yùn)算符(條件運(yùn)算符)
- JavaScript三目運(yùn)算符和C語言也一樣
- 格式: 條件表達(dá)式 ? 語句1 : 語句2;
// 彈第一個(gè) true?alert("語句1") : alert("語句2"); // 彈第二個(gè) false?alert("語句1") : alert("語句2");