一元操作符
只能操作一個值的操作符。
遞增和遞減操作符
- 前置型:位于要操作的變量之前;
- 后置型:位于要操作的變量之后。
如:
var age = 24;
++ age;
//等同于
var age = 24;
age = age + 1;
var age = 24;
-- age;
//等同于
var age = 24;
age = age - 1;
副效應(yīng):執(zhí)行前置遞增和遞減操作時,變量的值都在語句被求值前改變嘉蕾。
var age = 24;
var newage = --age + 2;
console.log(age); //值為23
console.log(newage); //值為25
console.log(age + newage); //值為48
后置型遞增和遞減操作是在包含她們的語句被求值之后才執(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)用于浮點數(shù)值,執(zhí)行遞增和遞減操作障贸;
- 如果應(yīng)用于對象错森,先調(diào)用對象的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
一元加和減操作符
一元加操作符以一個(+)表示涩维,但是放在數(shù)值前面不會產(chǎn)生影響。
再對非數(shù)值應(yīng)用一元操作符時袁波,會先對值進(jìn)行轉(zhuǎn)換瓦阐。
一元操作符還能用于表示負(fù)數(shù)蜗侈,也就是將正數(shù)轉(zhuǎn)換為負(fù)數(shù),但對非數(shù)值時睡蟋,也會先對它進(jìn)行轉(zhuǎn)換踏幻。
位操作符
這部分內(nèi)容來自于developer.mozilla.org/
有符號32位整數(shù)
位操作符用于在最基本的層次上,即按照內(nèi)存中表示數(shù)值的位來操作數(shù)值戳杀。
所有的按位操作符的操作數(shù)都會被轉(zhuǎn)成補(bǔ)碼(two's complement)形式的有符號32位整數(shù)该面。補(bǔ)碼形式是指一個數(shù)的負(fù)對應(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)一個數(shù)是正數(shù)時桥嗤,其最左的比特位是0,當(dāng)一個數(shù)是負(fù)數(shù)時仔蝌,其最左的比特位是1泛领。因此,最左邊的比特位被稱為符號位(sign bit)敛惊。
0 是所有比特數(shù)字0組成的整數(shù)渊鞋。
0 (base 10) = 00000000000000000000000000000000 (base 2)
-1 是所有比特數(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位有符號數(shù)字所能表示的最小和最大整數(shù)执俩。
按位邏輯操作符
從概念上講,按位邏輯操作符按遵守下面規(guī)則:
- 操作數(shù)被轉(zhuǎn)換成32位整數(shù)癌刽,用比特序列(0和1組成)表示爵川。
- 第一個操作數(shù)的每個比特位與第二個操作數(shù)的相應(yīng)比特位匹配:第一位對應(yīng)第一位枚驻,第二位對應(yīng)第二位,以此類推。
- 位運(yùn)算符應(yīng)用到每對比特位价说,結(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 |
對于每一個比特位蛤迎,只有兩個操作數(shù)相應(yīng)的比特位都是1時,結(jié)果才為1含友,否則為0替裆。 |
按位或(OR) | a | b |
對于每一個比特位,當(dāng)兩個操作數(shù)相應(yīng)的比特位至少有一個1時窘问,結(jié)果為1辆童,否則為0。 |
按位異或(XOR) | a ^ b |
對于每一個比特位惠赫,當(dāng)兩個操作數(shù)相應(yīng)的比特位有且只有一個1時把鉴,結(jié)果為1,否則為0儿咱。 |
按位非(NOT) | ~ a |
反轉(zhuǎn)操作數(shù)的比特位庭砍,即0變成1,1變成0混埠。 |
左移(Left shift) | a << b |
將 a 的二進(jìn)制形式向左移 b (< 32) 比特位怠缸,右邊用0填充。 |
有符號右移 | a >> b |
將 a 的二進(jìn)制表示向右移b (< 32) 位钳宪,保留符號位(即正負(fù)號標(biāo)記)揭北。 |
無符號右移 | a >>> b |
將 a 的二進(jìn)制表示向右移b (< 32) 位,丟棄被移出的位吏颖,并使用 0 在左側(cè)填充搔体。 |
布爾操作符
布爾操作符一共有以下3個:
- 邏輯非(not)(!)
- 與(and)(&&)
- 或(or)(||)
邏輯非(!)
邏輯非操作符由一個嘆號(!)表示,可以用于任何值侦高。無論這個值是什么數(shù)據(jù)類型嫉柴,這個操作符都會返回一個布爾值。
邏輯非操作符遵循下列規(guī)則:
- 如果操作數(shù)是一個對象奉呛,返回false计螺;
- 如果操作數(shù)是一個空字符串,返回true瞧壮;
- 如果操作數(shù)是一個非空字符串登馒,返回false;
- 如果操作數(shù)是數(shù)值0咆槽,返回true陈轿;
- 如果操作時是任意非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
如果同時使用兩個邏輯非操作符罗售,可以得到這個值對應(yīng)的布爾值。
邏輯與(&&)
邏輯與操作符由 && 表示钩述,有兩個操作數(shù)寨躁,如:
var result = true && false;
其值表為:
第一個操作符 | 第二個操作符 | 結(jié)果 |
---|---|---|
true | true | true |
true | flase | false |
false | true | false |
false | flase | false |
邏輯與操作符可以應(yīng)用于任何類型的操作數(shù)。
邏輯與操作符遵循下列規(guī)則:
- 如果第一個操作數(shù)是對象牙勘,則返回第二個操作數(shù)职恳;
- 如果第二個操作數(shù)是對象,則只有在第一個操作數(shù)的求值結(jié)果為true的情況下才會返回該對象谜悟;
- 如果兩個操作數(shù)都是對象话肖,則返回第二個操作數(shù)北秽;
- 如果有一個操作數(shù)是null葡幸,返回null;
- 如果有一個操作數(shù)是NaN贺氓,返回NaN蔚叨;
- 如果有一個操作數(shù)是underfined,返回underfined辙培。
如果第一個操作數(shù)是false蔑水,無論第二個操作數(shù)是什么值,結(jié)果都為false扬蕊。
邏輯或(||)
邏輯或操作符由 || 表示搀别,有兩個操作數(shù),如:
var result = true || false;
其值表為:
第一個操作符 | 第二個操作符 | 結(jié)果 |
---|---|---|
true | true | true |
true | flase | true |
false | true | true |
false | flase | false |
邏輯與操作符遵循下列規(guī)則:
- 如果第一個操作數(shù)是對象尾抑,則返回第一個操作數(shù)歇父;
- 如果第一個操作數(shù)的求值結(jié)果為false,則返回第二個操作數(shù)再愈;
- 如果兩個操作數(shù)都是對象榜苫,則返回第一個操作數(shù);
- 如果有一個操作數(shù)是null翎冲,返回null垂睬;
- 如果有一個操作數(shù)是NaN,返回NaN;
- 如果有一個操作數(shù)是underfined驹饺,返回underfined钳枕。
如果第一個操作數(shù)是true,無論第二個操作數(shù)是什么值赏壹,結(jié)果都為true么伯。
乘性操作符
3個乘性操作符:
- 乘法;
- 除法卡儒;
- 求模田柔。
如果參與乘性計算的某個操作符不是數(shù)值,后臺會先使用number()轉(zhuǎn)型函數(shù)將其轉(zhuǎn)換為數(shù)值骨望。
乘法
乘法操作符由一個 * 表示硬爆,用于計算兩個數(shù)值的乘積。
乘法操作符遵循下列規(guī)則:
- 數(shù)值 * 數(shù)值擎鸠,執(zhí)行常規(guī)乘法計算缀磕;
- x * NaN,結(jié)果為NaN劣光;
- Infinity * 0袜蚕,結(jié)果為NaN;
- Infinity * y(y不等于0)绢涡,結(jié)果為+-Infinity牲剃;
- Infinity * Infinity,結(jié)果為Infinity雄可。
除法
除法操作符由一個 / 表示凿傅,執(zhí)行兩個數(shù)值的除法運(yùn)算。
除法操作符遵循下列規(guī)則:
- 數(shù)值 / 數(shù)值数苫,執(zhí)行常規(guī)除法計算聪舒;
- x / NaN,結(jié)果為NaN虐急;
- 0 / 0箱残,結(jié)果為NaN;
- 非零有限數(shù) / 0止吁,結(jié)果為+-Infinity被辑;
- Infinity / Infinity,結(jié)果為結(jié)果為NaN赏殃;
- Infinity / 任何非零數(shù)敷待,結(jié)果為+-Infinity。
求模
求模(余數(shù))操作符由一個 % 表示仁热。
求模操作符遵循下列規(guī)則:
- 數(shù)值 % 數(shù)值榜揖,執(zhí)行常規(guī)求模計算勾哩;
- 無窮大值 % 有限大值,結(jié)果為NaN举哟;
- 有限大值 % 0思劳,結(jié)果為NaN;
- Infinity % Infinity妨猩,結(jié)果為NaN潜叛;
- 有限大值 % 無窮大值,結(jié)果為有限大值壶硅;
- 0 % 任何數(shù)威兜,結(jié)果為0。
加性運(yùn)算符
加法
加法操作符由一個 + 表示庐椒。
加法操作符遵循下列規(guī)則:
- 在兩個操作數(shù)都是數(shù)字的時候椒舵,會做加法運(yùn)算
- 兩個參數(shù)都是字符串或在有一個參數(shù)是字符串的情況下會把另外一個參數(shù)轉(zhuǎn)換為字符串做字符串拼接
- 在參數(shù)有對象的情況下會調(diào)用其valueOf或toString
- 在只有一個字符串參數(shù)的時候會嘗試將其轉(zhuǎn)換為數(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
減法
加法操作符由一個 - 表示。
加法操作符遵循下列規(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個:
- 小于(<)担败;
- 大于(>);
- 小于等于(>=)镰官;
- 大于等于(>=)。
關(guān)系操作符遵循下列規(guī)則:
- 如果兩個操作數(shù)都是數(shù)值吗货,執(zhí)行數(shù)值比較泳唠;
- 如果兩個操作符都是字符串,執(zhí)行兩個字符串對應(yīng)的字符編碼值比較宙搬;
- 如果兩個操作符其中一個是數(shù)值笨腥,將另一個轉(zhuǎn)換為數(shù)值再進(jìn)行比較;
- 如果兩個操作符其中一個是布爾值勇垛,將其轉(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ù)值肥照;
- 如果一個操作符石對象脚仔,另一個不是則遵循:
- null == underfined舆绎;
- 比較之前鲤脏,不能將null和underfined轉(zhuǎn)換為其他任何值吕朵;
- 如果有一個操作數(shù)是NaN猎醇,相等操作符返回false努溃,不相等操作符返回true姑食;
- NaN == NaN,相等操作符返回false茅坛,不相等操作符返回true音半;
- 如果兩個操作數(shù)都是對象,則比較她們是不是同一個對象曹鸠。
全等和不全等
僅比較不轉(zhuǎn)換
全等操作符由 === 表示;
不全等操作符由 !== 表示斥铺。
null == underfined,返回true晾蜘;
null === underfined邻眷,返回false,因為它們是不同類型的值剔交。
條件操作符
語法
condition ? expr1 : expr2
參數(shù)
condition:計算結(jié)果為true或false的表達(dá)式肆饶。
expr1, expr2:值可以是任何類型的表達(dá)式。
描述
如果條件值為真值(true)岖常,運(yùn)算符就會返回 expr1 的值驯镊;否則竭鞍, 就會返回 expr2 的值。
var a = 13;
var b = 16;
var max = (a > b) ? a : b;
console.log(max); //返回值為16
賦值操作符
賦值操作符由 = 表示偎快。
簡單賦值操作:
var age = 18;
復(fù)合賦值(在 = 前面添加其他操作符)操作:
var age = 18;
age += 10;
//等同于
age = age + 10;
逗號操作符
使用逗號操作符可以在一條語句中執(zhí)行多個操作,如:
//逗號操作符用于聲明多個變量
var a = 1, b = 2, c = 3;
//逗號操作符用于賦值
var a = (1,2,3,4);
//由于4是表達(dá)式中的最后一項晒夹,因此a的值就是4
運(yùn)算符優(yōu)先級匯總表
練習(xí)
// Number + Number -> 數(shù)字相加
console.log(1+1); //2
// String + String -> 字符串連接
console.log("2"+"4"); //"24"
// Number + String -> 字符串連接
console.log(2+"4"); //"24"
// 只有一個字符串參數(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