一元操作符
只能操作一個(gè)值的操作符。
遞增和遞減操作符
- 前置型:位于要操作的變量之前;
- 后置型:位于要操作的變量之后。
如:
var age = 24;
++ age;
//等同于
var age = 24;
age = age + 1;
var age = 24;
-- age;
//等同于
var age = 24;
age = age - 1;
副效應(yīng):執(zhí)行前置遞增和遞減操作時(shí),變量的值都在語(yǔ)句被求值前改變。
var age = 24;
var newage = --age + 2;
console.log(age); //值為23
console.log(newage); //值為25
console.log(age + newage); //值為48
后置型遞增和遞減操作是在包含她們的語(yǔ)句被求值之后才執(zhí)行。
var age = 24;
var newage = age-- + 2;
console.log(age); //值為23
console.log(newage); //值為26
console.log(age + newage); //值為49
遞增和遞減操作符遵循下列規(guī)則:
- 如果字符串包含有效數(shù)字字符,先將其轉(zhuǎn)換為數(shù)字值,在執(zhí)行遞增和遞減操作,字符串變量變成數(shù)值變量;
- 如果字符串不包含有效數(shù)字字符,將變量的值設(shè)置為NaN,字符串變量變成數(shù)值變量;
- 布爾值true 或者false,將轉(zhuǎn)換為1或者0,再執(zhí)行遞增和遞減操作,布爾值變量變成數(shù)值變量;
- 如果應(yīng)用于浮點(diǎn)數(shù)值,執(zhí)行遞增和遞減操作;
- 如果應(yīng)用于對(duì)象,先調(diào)用對(duì)象的valueOf()方法,取得可供操作的值再應(yīng)用上述規(guī)則。
var a = 24;
var b = "a";
var c = true;
var d = 1.1;
var e = {
valueOf: function() {
return -1;
}
};
a++;
b++;
c++;
d--;
e++;
console.log(a); //值為25
console.log(b); //值為NaN
console.log(c); //值為2
console.log(d); //值為0.10000000000000009
console.log(e); //值為0
一元加和減操作符
一元加操作符以一個(gè)(+)表示,但是放在數(shù)值前面不會(huì)產(chǎn)生影響。
再對(duì)非數(shù)值應(yīng)用一元操作符時(shí),會(huì)先對(duì)值進(jìn)行轉(zhuǎn)換。
一元操作符還能用于表示負(fù)數(shù),也就是將正數(shù)轉(zhuǎn)換為負(fù)數(shù),但對(duì)非數(shù)值時(shí),也會(huì)先對(duì)它進(jìn)行轉(zhuǎn)換。
位操作符
這部分內(nèi)容來(lái)自于developer.mozilla.org/
有符號(hào)32位整數(shù)
位操作符用于在最基本的層次上,即按照內(nèi)存中表示數(shù)值的位來(lái)操作數(shù)值。
所有的按位操作符的操作數(shù)都會(huì)被轉(zhuǎn)成補(bǔ)碼(two's complement)形式的有符號(hào)32位整數(shù)。補(bǔ)碼形式是指一個(gè)數(shù)的負(fù)對(duì)應(yīng)值(negative counterpart)為數(shù)值的所有比特位反轉(zhuǎn)后,再加1。反轉(zhuǎn)比特位即該數(shù)值進(jìn)行’非‘位運(yùn)算,也即該數(shù)值的反碼。例如下面為整數(shù)314的二進(jìn)制編碼:
00000000000000000000000100111010
下面編碼 ~314,即 314 的反碼:
11111111111111111111111011000101
最后,下面編碼 -314,即 314 的補(bǔ)碼:
11111111111111111111111011000110
補(bǔ)碼保證了當(dāng)一個(gè)數(shù)是正數(shù)時(shí),其最左的比特位是0,當(dāng)一個(gè)數(shù)是負(fù)數(shù)時(shí),其最左的比特位是1。因此,最左邊的比特位被稱(chēng)為符號(hào)位(sign bit)。
0 是所有比特?cái)?shù)字0組成的整數(shù)。
0 (base 10) = 00000000000000000000000000000000 (base 2)
-1 是所有比特?cái)?shù)字1組成的整數(shù)。
-1 (base 10) = 11111111111111111111111111111111 (base 2)
-2147483648(十六進(jìn)制形式:-0x80000000)是除了最左邊為1外,其他比特位都為0的整數(shù)。
-2147483648 (base 10) = 10000000000000000000000000000000 (base 2)
2147483647(十六進(jìn)制形式:0x7fffffff)是除了最左邊為0外,其他比特位都為1的整數(shù)。
2147483647 (base 10) = 01111111111111111111111111111111 (base 2)
數(shù)字-2147483648 和 2147483647 是32位有符號(hào)數(shù)字所能表示的最小和最大整數(shù)。
按位邏輯操作符
從概念上講,按位邏輯操作符按遵守下面規(guī)則:
- 操作數(shù)被轉(zhuǎn)換成32位整數(shù),用比特序列(0和1組成)表示。
- 第一個(gè)操作數(shù)的每個(gè)比特位與第二個(gè)操作數(shù)的相應(yīng)比特位匹配:第一位對(duì)應(yīng)第一位,第二位對(duì)應(yīng)第二位,以此類(lèi)推。
- 位運(yùn)算符應(yīng)用到每對(duì)比特位,結(jié)果是新的比特值。
按位操作符(Bitwise operators) 將其操作數(shù)(operands)當(dāng)作32位的比特序列(由0和1組成),而不是十進(jìn)制、十六進(jìn)制或八進(jìn)制數(shù)值。例如,十進(jìn)制數(shù)9,用二進(jìn)制表示則為1001。按位操作符操作數(shù)字的二進(jìn)制形式,但是返回值依然是標(biāo)準(zhǔn)的JavaScript數(shù)值。
下面的表格總結(jié)了JavaScript中的按位操作符:
| 運(yùn)算符 | 用法 | 描述 |
|---|---|---|
| 按位與( AND) | a & b |
對(duì)于每一個(gè)比特位,只有兩個(gè)操作數(shù)相應(yīng)的比特位都是1時(shí),結(jié)果才為1,否則為0。 |
| 按位或(OR) | a | b |
對(duì)于每一個(gè)比特位,當(dāng)兩個(gè)操作數(shù)相應(yīng)的比特位至少有一個(gè)1時(shí),結(jié)果為1,否則為0。 |
| 按位異或(XOR) | a ^ b |
對(duì)于每一個(gè)比特位,當(dāng)兩個(gè)操作數(shù)相應(yīng)的比特位有且只有一個(gè)1時(shí),結(jié)果為1,否則為0。 |
| 按位非(NOT) | ~ a |
反轉(zhuǎn)操作數(shù)的比特位,即0變成1,1變成0。 |
| 左移(Left shift) | a << b |
將 a 的二進(jìn)制形式向左移 b (< 32) 比特位,右邊用0填充。 |
| 有符號(hào)右移 | a >> b |
將 a 的二進(jìn)制表示向右移b(< 32) 位,保留符號(hào)位(即正負(fù)號(hào)標(biāo)記)。 |
| 無(wú)符號(hào)右移 | a >>> b |
將 a 的二進(jìn)制表示向右移b(< 32) 位,丟棄被移出的位,并使用 0 在左側(cè)填充。 |
布爾操作符
布爾操作符一共有以下3個(gè):
- 邏輯非(not)(!)
- 與(and)(&&)
- 或(or)(||)
邏輯非(!)
邏輯非操作符由一個(gè)嘆號(hào)(!)表示,可以用于任何值。無(wú)論這個(gè)值是什么數(shù)據(jù)類(lèi)型,這個(gè)操作符都會(huì)返回一個(gè)布爾值。
邏輯非操作符遵循下列規(guī)則:
- 如果操作數(shù)是一個(gè)對(duì)象,返回false;
- 如果操作數(shù)是一個(gè)空字符串,返回true;
- 如果操作數(shù)是一個(gè)非空字符串,返回false;
- 如果操作數(shù)是數(shù)值0,返回true;
- 如果操作時(shí)是任意非0數(shù)值,(包括infinity),返回false;
- 如果操作數(shù)是null,返回true;
- 如果操作數(shù)是NaN,返回true;
- 如果操作數(shù)是underfined,返回true。
例如:
var a = {
function(){
return 1;
}
};
console.log(!a); //false
console.log(!""); //true
console.log(!"hello world"); //false
console.log(!0); //true
console.log(!2017); //false
console.log(!null); //true
console.log(!NaN); //true
如果同時(shí)使用兩個(gè)邏輯非操作符,可以得到這個(gè)值對(duì)應(yīng)的布爾值。
邏輯與(&&)
邏輯與操作符由 && 表示,有兩個(gè)操作數(shù),如:
var result = true && false;
其值表為:
| 第一個(gè)操作符 | 第二個(gè)操作符 | 結(jié)果 |
|---|---|---|
| true | true | true |
| true | flase | false |
| false | true | false |
| false | flase | false |
邏輯與操作符可以應(yīng)用于任何類(lèi)型的操作數(shù)。
邏輯與操作符遵循下列規(guī)則:
- 如果第一個(gè)操作數(shù)是對(duì)象,則返回第二個(gè)操作數(shù);
- 如果第二個(gè)操作數(shù)是對(duì)象,則只有在第一個(gè)操作數(shù)的求值結(jié)果為true的情況下才會(huì)返回該對(duì)象;
- 如果兩個(gè)操作數(shù)都是對(duì)象,則返回第二個(gè)操作數(shù);
- 如果有一個(gè)操作數(shù)是null,返回null;
- 如果有一個(gè)操作數(shù)是NaN,返回NaN;
- 如果有一個(gè)操作數(shù)是underfined,返回underfined。
如果第一個(gè)操作數(shù)是false,無(wú)論第二個(gè)操作數(shù)是什么值,結(jié)果都為false。
邏輯或(||)
邏輯或操作符由 || 表示,有兩個(gè)操作數(shù),如:
var result = true || false;
其值表為:
| 第一個(gè)操作符 | 第二個(gè)操作符 | 結(jié)果 |
|---|---|---|
| true | true | true |
| true | flase | true |
| false | true | true |
| false | flase | false |
邏輯與操作符遵循下列規(guī)則:
- 如果第一個(gè)操作數(shù)是對(duì)象,則返回第一個(gè)操作數(shù);
- 如果第一個(gè)操作數(shù)的求值結(jié)果為false,則返回第二個(gè)操作數(shù);
- 如果兩個(gè)操作數(shù)都是對(duì)象,則返回第一個(gè)操作數(shù);
- 如果有一個(gè)操作數(shù)是null,返回null;
- 如果有一個(gè)操作數(shù)是NaN,返回NaN;
- 如果有一個(gè)操作數(shù)是underfined,返回underfined。
如果第一個(gè)操作數(shù)是true,無(wú)論第二個(gè)操作數(shù)是什么值,結(jié)果都為true。
乘性操作符
3個(gè)乘性操作符:
- 乘法;
- 除法;
- 求模。
如果參與乘性計(jì)算的某個(gè)操作符不是數(shù)值,后臺(tái)會(huì)先使用number()轉(zhuǎn)型函數(shù)將其轉(zhuǎn)換為數(shù)值。
乘法
乘法操作符由一個(gè) * 表示,用于計(jì)算兩個(gè)數(shù)值的乘積。
乘法操作符遵循下列規(guī)則:
- 數(shù)值 * 數(shù)值,執(zhí)行常規(guī)乘法計(jì)算;
- x * NaN,結(jié)果為NaN;
- Infinity * 0,結(jié)果為NaN;
- Infinity * y(y不等于0),結(jié)果為+-Infinity;
- Infinity * Infinity,結(jié)果為Infinity。
除法
除法操作符由一個(gè) / 表示,執(zhí)行兩個(gè)數(shù)值的除法運(yùn)算。
除法操作符遵循下列規(guī)則:
- 數(shù)值 / 數(shù)值,執(zhí)行常規(guī)除法計(jì)算;
- x / NaN,結(jié)果為NaN;
- 0 / 0,結(jié)果為NaN;
- 非零有限數(shù) / 0,結(jié)果為+-Infinity;
- Infinity / Infinity,結(jié)果為結(jié)果為NaN;
- Infinity / 任何非零數(shù),結(jié)果為+-Infinity。
求模
求模(余數(shù))操作符由一個(gè) % 表示。
求模操作符遵循下列規(guī)則:
- 數(shù)值 % 數(shù)值,執(zhí)行常規(guī)求模計(jì)算;
- 無(wú)窮大值 % 有限大值,結(jié)果為NaN;
- 有限大值 % 0,結(jié)果為NaN;
- Infinity % Infinity,結(jié)果為NaN;
- 有限大值 % 無(wú)窮大值,結(jié)果為有限大值;
- 0 % 任何數(shù),結(jié)果為0。
加性運(yùn)算符
加法
加法操作符由一個(gè) + 表示。
加法操作符遵循下列規(guī)則:
- 在兩個(gè)操作數(shù)都是數(shù)字的時(shí)候,會(huì)做加法運(yùn)算
- 兩個(gè)參數(shù)都是字符串或在有一個(gè)參數(shù)是字符串的情況下會(huì)把另外一個(gè)參數(shù)轉(zhuǎn)換為字符串做字符串拼接
- 在參數(shù)有對(duì)象的情況下會(huì)調(diào)用其valueOf或toString
- 在只有一個(gè)字符串參數(shù)的時(shí)候會(huì)嘗試將其轉(zhuǎn)換為數(shù)字
- 在只有一個(gè)數(shù)字參數(shù)的時(shí)候返回其正數(shù)值
var a = 5;
var b = 10;
console.log("5加10的值為:" + a + b); //5加10的值為:510
console.log("5加10的值為:" + (a + b)); //5加10的值為:15
減法
加法操作符由一個(gè) - 表示。
加法操作符遵循下列規(guī)則:
- x - NaN,結(jié)果為NaN;
- Infinity - Infinity,結(jié)果為NaN;
- -Infinity - -Infinity,結(jié)果為NaN;
- Infinity - -Infinity,結(jié)果為Infinity;
- -Infinity - Infinity,結(jié)果為-Infinity;
- +0 - +0 = +0;
- +0 - -0 = -0;
- -0 - -0 = +0.
關(guān)系操作符
關(guān)系操作符一共有4個(gè):
- 小于(<);
- 大于(>);
- 小于等于(>=);
- 大于等于(>=)。
關(guān)系操作符遵循下列規(guī)則:
- 如果兩個(gè)操作數(shù)都是數(shù)值,執(zhí)行數(shù)值比較;
- 如果兩個(gè)操作符都是字符串,執(zhí)行兩個(gè)字符串對(duì)應(yīng)的字符編碼值比較;
- 如果兩個(gè)操作符其中一個(gè)是數(shù)值,將另一個(gè)轉(zhuǎn)換為數(shù)值再進(jìn)行比較;
- 如果兩個(gè)操作符其中一個(gè)是布爾值,將其轉(zhuǎn)換為數(shù)值再進(jìn)行比較。
var a = "Brick";
var b = "alphabet";
console.log(a < b); //true
console.log(a.toLowerCase() < b.toLowerCase()); //false
相等操作符
相等和不相等
先轉(zhuǎn)換再比較
相等操作符由 == 表示;
不相等操作符由 != 表示。
相等操作符遵循下列規(guī)則:
- 如果包含布爾值:將false轉(zhuǎn)換為0,true轉(zhuǎn)換為1;
- 如果包含字符串和數(shù)值,將字符串轉(zhuǎn)換為數(shù)值;
- 如果一個(gè)操作符石對(duì)象,另一個(gè)不是則遵循:
- null == underfined;
- 比較之前,不能將null和underfined轉(zhuǎn)換為其他任何值;
- 如果有一個(gè)操作數(shù)是NaN,相等操作符返回false,不相等操作符返回true;
- NaN == NaN,相等操作符返回false,不相等操作符返回true;
- 如果兩個(gè)操作數(shù)都是對(duì)象,則比較她們是不是同一個(gè)對(duì)象。
全等和不全等
僅比較不轉(zhuǎn)換
全等操作符由 === 表示;
不全等操作符由 !== 表示。
null == underfined,返回true;
null === underfined,返回false,因?yàn)樗鼈兪遣煌?lèi)型的值。
條件操作符
語(yǔ)法
condition ? expr1 : expr2
參數(shù)
condition:計(jì)算結(jié)果為true或false的表達(dá)式。
expr1, expr2:值可以是任何類(lèi)型的表達(dá)式。
描述
如果條件值為真值(true),運(yùn)算符就會(huì)返回 expr1 的值;否則, 就會(huì)返回 expr2 的值。
var a = 13;
var b = 16;
var max = (a > b) ? a : b;
console.log(max); //返回值為16
賦值操作符
賦值操作符由 = 表示。
簡(jiǎn)單賦值操作:
var age = 18;
復(fù)合賦值(在 = 前面添加其他操作符)操作:
var age = 18;
age += 10;
//等同于
age = age + 10;
逗號(hào)操作符
使用逗號(hào)操作符可以在一條語(yǔ)句中執(zhí)行多個(gè)操作,如:
//逗號(hào)操作符用于聲明多個(gè)變量
var a = 1, b = 2, c = 3;
//逗號(hào)操作符用于賦值
var a = (1,2,3,4);
//由于4是表達(dá)式中的最后一項(xiàng),因此a的值就是4
運(yùn)算符優(yōu)先級(jí)匯總表

練習(xí)
// Number + Number -> 數(shù)字相加
console.log(1+1); //2
// String + String -> 字符串連接
console.log("2"+"4"); //"24"
// Number + String -> 字符串連接
console.log(2+"4"); //"24"
// 只有一個(gè)字符串參數(shù) -> 數(shù)值
console.log(+"4"); //4
var a = 1;
a+++a;
// a+++a -> (a++)+a,a++返回值為1,a自增運(yùn)算結(jié)果為2,即1+2=3
typeof a+2;
// typeof a+2 -> (typeof a)+2,typeof a返回值為number,即number+2="number2"
var a = 1;
var b = 3;
console.log( a+++b );
// a+++b -> (a++)+b,a++返回值為1,即1+3=4