一些運(yùn)算符可以作用于任何數(shù)據(jù)類型(typeof)空骚,但大部分操作符希望操作數(shù)是特定的類型携悯,而且大部分操作符會計(jì)算出(我們也常說返回)一個(gè)特定類型的值(typeof返回的全是string)进胯。在JavaScript中,運(yùn)算符通常會根據(jù)需要對操作數(shù)進(jìn)行類型轉(zhuǎn)換.
有些操作符對不同的數(shù)據(jù)類型有不同的含義,比如 +操作符
console.log(2+4);//6 兩個(gè)操作數(shù)都是數(shù)字,做加法運(yùn)算
console.log("2"+"4");//"24" 兩個(gè)參數(shù)都是字符串,做字符串拼接
console.log(2+"4");//"24" 有一個(gè)參數(shù)是字符串時(shí)振诬,把另外一個(gè)參數(shù)轉(zhuǎn)換為字符串做字符串拼接
console.log(2+new Date());//"2Mon Jan 20 2014 17:15:01 GMT+0800 (China Standard Time)" 在參數(shù)有對象的情況下會調(diào)用其valueOf或toString
console.log(+"4");//4 只有一個(gè)數(shù)字參數(shù)時(shí),返回其正數(shù)值
遠(yuǎn)算符類型
算數(shù)運(yùn)算符衍菱、賦值運(yùn)算符赶么、比較運(yùn)算符、布爾運(yùn)算符脊串、位運(yùn)算符禽绪,其它運(yùn)算符
在位運(yùn)算符中
否運(yùn)算(not):符號為~,表示將一個(gè)二進(jìn)制位變成相反值洪规。
對于十進(jìn)制,~X得到結(jié)果是取X的負(fù)值再減1
在算數(shù)運(yùn)算符中循捺,
除法運(yùn)算符(Division):x / y 結(jié)果是浮點(diǎn)數(shù)
在布爾運(yùn)算符中斩例,使用布爾運(yùn)算符,會先將運(yùn)算符兩邊的值轉(zhuǎn)化為布爾值从橘,然后進(jìn)行運(yùn)算念赶。
! 取反運(yùn)算符 /*表示轉(zhuǎn)換為布爾類型之后取反,由此可得!!表示強(qiáng)制轉(zhuǎn)化成布爾類型*/
&& 且運(yùn)算符
|| 或運(yùn)算符
condition? true case : false case 三元條件運(yùn)算符
小括號
圓括號不是運(yùn)算符恰力,而是一種語法結(jié)構(gòu)叉谜。它有兩種用法:如果把表達(dá)式放在圓括號之中,作用是求值踩萎,將返回表達(dá)式的值停局;如果跟在函數(shù)的后面,作用是調(diào)用函數(shù)香府。
void
void運(yùn)算符的作用是執(zhí)行一個(gè)表達(dá)式董栽,然后返回undefined。
void 0 和 undefined在使用場景上有什么區(qū)別
void 后面無論跟什么表達(dá)式企孩,都會返回 undefined锭碳。
某些情境下undefined是可以被賦值的,比如在函數(shù)中var undefined = 3;這樣的話就不能用undefined來進(jìn)行判斷了勿璃。所以用void 0返回undefined來進(jìn)行判斷擒抛。既減少了在原形鏈上查找 window.undefined 的時(shí)間推汽,也避免了誤用被修改過的 undefined。
逗號運(yùn)算符
逗號運(yùn)算符用于對兩個(gè)表達(dá)式求值歧沪,并返回后一個(gè)表達(dá)式的值歹撒。
a = (3,4) //a=4
a = 3,4 //a=3,因?yàn)?的優(yōu)先級高于,
重要:運(yùn)算符優(yōu)先級與結(jié)合性
有的運(yùn)算符是左結(jié)合的槽畔,即運(yùn)算從左到右執(zhí)行栈妆,下面兩個(gè)運(yùn)算是一樣的
w = x + y + z;
w = (x + y) + z;
有的運(yùn)算符是右結(jié)合的,即運(yùn)算從右到左執(zhí)行
w = x = y = z;
w = (x = (y = z));
w = a: b: c ? d : e? f : g;
w = a? b : (c? d: (e? f : g));
下表中R/L代表結(jié)合性是右結(jié)合還是左結(jié)合厢钧,
num->num表示操作符期望的數(shù)據(jù)類型和計(jì)算結(jié)果類型鳞尔,lval指左值
運(yùn)算符優(yōu)先級表
以及MDN 參考
有幾個(gè)我們需要注意的地方
1.typeof的優(yōu)先級相當(dāng)?shù)母撸燃訙p乘除神馬的都高早直,所以雖然是操作符寥假,在在復(fù)雜表達(dá)式的時(shí)候我們還是習(xí)慣加括號,看個(gè)例子
typeof 2*3;//NaN 因?yàn)闀扔?jì)算typeof 2 霞扬,結(jié)果是"number"糕韧,即string類型,與3相乘得NaN
typeof (2*3);//"number"
typeof 2+3;// "number3" "number"+3 得"number3"
2.++喻圃、--是右結(jié)合的操作符(優(yōu)先級最高的幾個(gè)都是右結(jié)合)萤彩,而且比加減乘除優(yōu)先級高。
同時(shí)自增斧拍、自減運(yùn)算符的運(yùn)算數(shù)得是左值(可以放在賦值符號左邊的值)雀扶,而不能是常數(shù)
4++; //ReferenceError: Invalid left-hand side expression in postfix operation
var a=0,b=0;
a+++b;//0
a;//1,++優(yōu)先級比+高肆汹,所以相當(dāng)于(a++)+b=0+0=0 , 因?yàn)閍++為0愚墓,a為1
b;//0
3.賦值運(yùn)算符的優(yōu)先級相當(dāng)?shù)牡?/p>
a = b == c; //等同于a = (b==c)
4.邏輯非!優(yōu)先級比加減乘除高,但邏輯與昂勉、邏輯或優(yōu)先級很低浪册,不如加減乘除
!2*3; //0, 等價(jià)于(!2)*0, !2得false岗照,false與3相乘村象,即0*3得0
5.一個(gè)關(guān)于邏輯運(yùn)算符的有意思地方是其“短路”特點(diǎn). ||前面為ture,返回前面的值,為false谴返,返回后面的值煞肾。
&&前面為false,返回前面的值,為false,返回后面的值嗓袱。
||前面為ture,返回前面的值籍救,為false,返回后面的值渠抹。
! 如果操作數(shù)能夠轉(zhuǎn)換為true則返回false蝙昙;否則返回true闪萄。
能被轉(zhuǎn)換為false的值有null, 0, NaN, 空字符串("")和undefined。
1 && 3; 得3
1 && "foo" || 0; 得"foo"
1 || "foo" && 0 得1奇颠,因?yàn)?amp;&優(yōu)先級高于|| 相當(dāng)于 1 || ("foo" && 0 )
相等:==與===
===是嚴(yán)格意義的相等败去,只需注意NaN和NaN不等就行了。而使用==的時(shí)候烈拒,javascript會幫我們做類型轉(zhuǎn)換圆裕,造成一些匪夷所思的結(jié)果,那么使用==的時(shí)候會在哪些情況下做類型轉(zhuǎn)換荆几,又會換成什么樣子吓妆?
- 如果兩個(gè)值類型相同,則執(zhí)行嚴(yán)格相等的運(yùn)算
- 如果兩個(gè)值的類型不同
- 如果一個(gè)是null吨铸,一個(gè)是undefined行拢,那么相等
- 如果一個(gè)是數(shù)字,一個(gè)是字符串诞吱,先將字符串轉(zhuǎn)為數(shù)字舟奠,然后比較
- 如果一個(gè)值是true/false則將其轉(zhuǎn)為1/0比較
- 如果一個(gè)值是對象,一個(gè)是數(shù)字或字符串房维,則嘗試使用valueOf和toString轉(zhuǎn)換后比較
- 其它就不相等了