運算符類型
算數(shù)運算符
加法運算符(Addition):x + y
減法運算符(Subtraction): x - y
乘法運算符(Multiplication): x * y
除法運算符(Division):x / y
余數(shù)運算符(Remainder):x % y
自增運算符(Increment):++x 或者 x++
自減運算符(Decrement):--x 或者 x--
求負(fù)運算符(Negate):-x
數(shù)值運算符(Convert to number): +x
賦值運算符
賦值運算符用于給變量賦值,最常見的賦值運算符,當(dāng)然就是等號,表達(dá)式x=y表示將y賦值給x。除此之外,JavaScript還提供其他11個賦值運算符。
x += y // 等同于 x = x + y
x -= y // 等同于 x = x - y
x *= y // 等同于 x = x * y
x /= y // 等同于 x = x / y
x %= y // 等同于 x = x % y
x >>= y // 等同于 x = x >> y
x <<= y // 等同于 x = x << y
x >>>= y // 等同于 x = x >>> y
x &= y // 等同于 x = x & y
x |= y // 等同于 x = x | y
x ^= y // 等同于 x = x ^ y
比較運算符
比較運算符比較兩個值,然后返回一個布爾值,表示是否滿足比較條件。JavaScript提供了8個比較運算符。
== 相等
=== 嚴(yán)格相等
!=不相等
!== 嚴(yán)格不相等
< 小于
<= 小于或等于
> 大于
>= 大于或等于
布爾運算符
! 取反運算符
&& 且運算符
|| 或運算符
condition? true case : false case 三元條件運算符
位運算符
或運算(or):符號為|,表示兩個二進(jìn)制位中有一個為1,則結(jié)果為1,否則為0。
與運算(and):符號為&,表示兩個二進(jìn)制位都為1,則結(jié)果為1,否則為0。
否運算(not):符號為~,表示將一個二進(jìn)制位變成相反值。
異或運算(xor):符號為?,表示兩個二進(jìn)制位中有且僅有一個為1時,結(jié)果為1,否則為0。
左移運算(left shift):符號為<<
右移運算(right shift):符號為>>
帶符號位的右移運算(zero filled right shift):符號為>>>
其它
小括號
在JavaScript中,圓括號是一種運算符,它有兩種用法:如果把表達(dá)式放在圓括號之中,作用是求值;如果跟在函數(shù)的后面,作用是調(diào)用函數(shù)。
把表達(dá)式放在圓括號之中,將返回表達(dá)式的值。
void
void運算符的作用是執(zhí)行一個表達(dá)式,然后返回undefined。
逗號運算符
逗號運算符用于對兩個表達(dá)式求值,并返回后一個表達(dá)式的值。
運算符優(yōu)先級與結(jié)合性
優(yōu)先級什么意思大家都清楚,結(jié)合性是指多個具有同樣優(yōu)先級的運算符表達(dá)式中的運算順序。有的運算符是左結(jié)合的,即運算從左到右執(zhí)行,下面兩個運算是一樣的
w = x + y + z;
w = (x + y) + z;
有的運算符是右結(jié)合的
w = x = y = z;
w = (x = (y = z));
w = a: b: c ? d : e? f : g;
w = a? b : (c? d: (e? f : g));
運算符的優(yōu)先級《JavaScript權(quán)威指南》中有個表闡述的很好(我去掉了位運算部分),其中R/L代表結(jié)合性是右結(jié)合還是左結(jié)合,num->num表示操作符期望的數(shù)據(jù)類型和計算結(jié)果類型,lval指左值
|運算符 |操作| 結(jié)合性| 類型|
| ------- |:----:| ----:|
|++ |自增| R| lval->num|
|-- |自減| R| lval->num|
|- |求反| R| num->num|
|+(一個操作數(shù))| 轉(zhuǎn)換為數(shù)字| R| num->num|
|~ |按位求反| R| int->int|
|! |邏輯非 |R| bool->bool|
|delete |刪除屬性| R| lval->bool|
|typeof |檢測數(shù)據(jù)類型| R| any->str|
|void| 返回undefined| R| any->undefined|
| /|
|*、/、%| 乘、除、求余| L| num,num->num|
| /|
|+、-| 加、減| L| num,num->num|
|+ |字符串拼接| L| str,str->str|
|<、<=、>、>=| 數(shù)字大小或字母表順序| L |num/str,num/str->bool|
|instanceof |對象類型| L| obj,function->bool|
|in |測試屬性是否存在| L |str,obj->bool|
| /|
|== |判斷相等| L| any,any->bool|
|!=| 判斷不等| L| any,any->bool|
|===| 判斷恒等| L| any,any->bool|
|!==| 判斷非恒等| L| any,any->bool|
| /|
|&& |邏輯與| L| any,any->any|
| ||| 邏輯或 | L| any,any->any|
|?: |條件運算符| R| bool,any,any->any|
|=賦值 *=、/=、+=、-= |賦值 運算且賦值| R| lval,any->any|
|, |忽略第一個操作數(shù),返回第二個操作數(shù)| L| any,any->any|
有幾個我們需要注意的地方
1.typeof的優(yōu)先級相當(dāng)?shù)母?,比加減乘除神馬的都高,所以雖然是操作符,在在復(fù)雜表達(dá)式的時候我們還是習(xí)慣加括號,看個例子
typeof 2*3;//NaN
typeof (2*3);//"number"
typeof 2+3;// "number3"
2.++、--是右結(jié)合的操作符(優(yōu)先級最高的幾個都是右結(jié)合),而且比加減乘除優(yōu)先級高。同時自增、自減運算符的運算數(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
b;//0
3.賦值運算符的優(yōu)先級相當(dāng)?shù)牡?/p>
a = b == c; //等同于a = (b==c)
4.邏輯非!也在優(yōu)先級隊列的前端,比加減乘除高,但邏輯與、邏輯或優(yōu)先級很低,不如加減乘除
!2*0; //0, 等價于(!2)*0
5.一個關(guān)于邏輯運算符的有意思地方是其“短路”功能,相信大家都有所了解,但有些題目不那么單純,會結(jié)合表達(dá)式計算值來考察
1 && 3;
1 && "foo" || 0;
1 || "foo" && 0
了解了邏輯運算符的“短路”特點,在知道原始表達(dá)式的“返回值”就是本身,題目就很簡單了
相等
我們知道可以使用==或===判斷兩個值的相等性,其中區(qū)別相信大家清楚,===是嚴(yán)格意義的相等,只需注意NaN和NaN不等就行了。而使用==的時候,javascript會幫我們做類型轉(zhuǎn)換,造成一些匪夷所思的結(jié)果,那么使用==的時候會在哪些情況下做類型轉(zhuǎn)換,又會換成什么樣子?
如果兩個值類型相同,則執(zhí)行嚴(yán)格相等的運算
如果兩個值的類型不同
如果一個是null,一個是undefined,那么相等
如果一個是數(shù)字,一個是字符串,先將字符串轉(zhuǎn)為數(shù)字,然后比較
如果一個值是true/false則將其轉(zhuǎn)為1/0比較
如果一個值是對象,一個是數(shù)字或字符串,則嘗試使用valueOf和toString轉(zhuǎn)換后比較
其它就不相等了
undefined==null //true
undefined===null //false
NaN==NaN //false
NaN===NaN //false
"1"==true//true
''==true //false
1==true//true
0==true//false
1===true//false
'1'==1//true
'1'===1//false