JavaScript中運算符主要用于連接簡單表達式把沼,組成一個復雜的表達式。常見的有算數(shù)表達式吁伺、比較表達式饮睬、邏輯表達式、賦值表達式等箱蝠,也有單目運算符续捂,指操作原始表達式。大多數(shù)運算符都由標點符號組成(+宦搬、>=牙瓢、!),也有關(guān)鍵字表示的運算符间校,如typeof矾克、delete、instanceof等憔足。
一些運算符可以作用于任何數(shù)據(jù)類型(typeof)胁附,但大部分操作符希望操作數(shù)是特定的類型,而且大部分操作符會計算出(我們也常說返回)一個特定類型的值(typeof返回的全是string)滓彰。在JavaScript中運算符通常會根據(jù)需要對操作數(shù)進行類型轉(zhuǎn)換控妻,乘法操作符希望操作數(shù)是數(shù)字,但是 "3" * "5"也是合法的揭绑,JavaScript會自動將其轉(zhuǎn)換為數(shù)字計算缆巧,返回Number 15米绕。
有些操作符對不同的數(shù)據(jù)類型有不同的含義著淆,比如 +:
- 在兩個操作數(shù)都是數(shù)字的時候却盘,會做加法運算。
- 兩個參數(shù)都是字符串或在有一個參數(shù)是字符串的情況下會把另外一個 - 參數(shù)轉(zhuǎn)換為字符串做字符串拼接邦蜜。
- 在參數(shù)有對象的情況下會調(diào)用其valueOf或toString依鸥。
- 在只有一個字符串參數(shù)的時候會嘗試將其轉(zhuǎn)換為數(shù)字。
- 在只有一個數(shù)字參數(shù)的時候返回其正數(shù)值悼沈。
console.log(2+4);//6
console.log("2"+"4");//"24"
console.log(2+"4");//"24"
console.log(2+new Date());//"2Mon Jan 20 2014 17:15:01 GMT+0800 (China Standard Time)"
console.log(+"4");//4
遠算符類型
算數(shù)運算符
- 加法運算符(Addition):x + y
- 減法運算符(Subtraction): x - y
- 乘法運算符(Multiplication): x * y
- 除法運算符(Division):x / y
- 余數(shù)運算符(Remainder):x % y
- 自增運算符(Increment):++x 或者 x++
自減運算符(Decrement):--x 或者 x--
求負運算符(Negate):-x
數(shù)值運算符(Convert to number): +x
賦值運算符
賦值運算符用于給變量賦值贱迟,最常見的賦值運算符,當然就是等號井辆,表達式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個比較運算符袍榆。
- == 相等
- === 嚴格相等
- !=不相等
- !== 嚴格不相等
- < 小于
- <= 小于或等于
- > 大于
- >= 大于或等于
布爾運算符
- ! 取反運算符
- && 且運算符
- || 或運算符
- condition? true case : false case 三元條件運算符
位運算符
- 或運算(or):符號為|胀屿,表示兩個二進制位中有一個為1,則結(jié)果為1包雀,否則為0宿崭。
- 與運算(and):符號為&,表示兩個二進制位都為1才写,則結(jié)果為1葡兑,否則為0。
- 否運算(not):符號為~赞草,表示將一個二進制位變成相反值讹堤。
- 異或運算(xor):符號為?,表示兩個二進制位中有且僅有一個為1時厨疙,結(jié)果為1洲守,否則為0。
- 左移運算(left shift):符號為<<
- 右移運算(right shift):符號為>>
- 帶符號位的右移運算(zero filled right shift):符號為>>>
其他
小括號
在JavaScript中沾凄,圓括號是一種運算符梗醇,它有兩種用法:如果把表達式放在圓括號之中,作用是求值撒蟀;如果跟在函數(shù)的后面叙谨,作用是調(diào)用函數(shù)。
把表達式放在圓括號之中保屯,將返回表達式的值唉俗。
void
void運算符的作用是執(zhí)行一個表達式,然后返回undefined配椭。
逗號運算符
逗號運算符用于對兩個表達式求值,并返回后一個表達式的值雹姊。
運算符優(yōu)先級與結(jié)合性
運算符 | 操作 | 結(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 |
優(yōu)先級什么意思大家都清楚,結(jié)合性是指多個具有同樣優(yōu)先級的運算符表達式中的運算順序拗秘。有的運算符是左結(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)先級相當?shù)母呗福燃訙p乘除神馬的都高益缎,所以雖然是操作符,在在復雜表達式的時候我們還是習慣加括號然想,看個例子
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)先級比+高屏富,所以相當于(a++)+b
b;//0
3.賦值運算符的優(yōu)先級相當?shù)牡?/p>
a = b == c; //等同于a = (b==c)
4.邏輯非!也在優(yōu)先級隊列的前端,比加減乘除高蛙卤,但邏輯與狠半、邏輯或優(yōu)先級很低,不如加減乘除
!2*0; //0, 等價于(!2)*0
5.一個關(guān)于邏輯運算符的有意思地方是其“短路”功能,相信大家都有所了解典予,但有些題目不那么單純甜滨,會結(jié)合表達式計算值來考察
1 && 3;
1 && "foo" || 0;
1 || "foo" && 0
了解了邏輯運算符的“短路”特點,在知道原始表達式的“返回值”就是本身瘤袖,題目就很簡單了
相等
相等
我們知道可以使用==或===判斷兩個值的相等性衣摩,其中區(qū)別相信大家清楚,===是嚴格意義的相等捂敌,只需注意NaN和NaN不等就行了艾扮。而使用==的時候,javascript會幫我們做類型轉(zhuǎn)換占婉,造成一些匪夷所思的結(jié)果泡嘴,那么使用==的時候會在哪些情況下做類型轉(zhuǎn)換,又會換成什么樣子逆济?
1.如果兩個值類型相同酌予,則執(zhí)行嚴格相等的運算
2.如果兩個值的類型不同
3.如果一個是null,一個是undefined奖慌,那么相等
4.如果一個是數(shù)字抛虫,一個是字符串,先將字符串轉(zhuǎn)為數(shù)字简僧,然后比較
5.如果一個值是true/false則將其轉(zhuǎn)為1/0比較
6.如果一個值是對象建椰,一個是數(shù)字或字符串,則嘗試使用valueOf和toString轉(zhuǎn)換后比較
7.其它就不相等了