運算符
JavaScript中運算符主要用于連接簡單表達式怕敬,組成一個復雜的表達式地啰。
常見的有算數表達式荠瘪、比較表達式啸胧、邏輯表達式扳缕、賦值表達式等锥腻,也有單目運算符嘱函,指操作原始表達式蓉驹。
大多數運算符都由標點符號組成(+曹宴、>=搂橙、!),也有關鍵字表示的運算符笛坦,如typeof区转、delete、instanceof等版扩。
一些運算符可以作用于任何數據類型(typeof)废离,但大部分操作符希望操作數是特定的類型,而且大部分操作符會計算出(我們也常說返回)一個特定類型的值(typeof返回的全是string)礁芦。在JavaScript中運算符通常會根據需要對操作數進行類型轉換蜻韭,乘法操作符希望操作數是數字,但是 "3" * "5"
也是合法的柿扣,JavaScript會自動將其轉換為數字計算肖方,返回Number 15。
有些操作符對不同的數據類型有不同的含義未状,比如+
- 在兩個操作數都是數字的時候俯画,會做加法運算
- 兩個參數都是字符串或在有一個參數是字符串的情況下會把另外一個參數轉換為字符串做字符串拼接
- 在參數有對象的情況下會調用其valueOf或toString
- 在只有一個字符串參數的時候會嘗試將其轉換為數字
- 在只有一個數字參數的時候返回其正數值
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
遠算符類型
算數運算符
- 加法運算符(Addition):x + y
- 減法運算符(Subtraction): x - y
- 乘法運算符(Multiplication): x * y
- 除法運算符(Division):x / y
- 余數運算符(Remainder):x % y
- 自增運算符(Increment):++x 或者 x++
- 自減運算符(Decrement):--x 或者 x--
- 求負運算符(Negate):-x
- 數值運算符(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旦事,則結果為1,否則為0急灭。 - 與運算(and):符號為
&
姐浮,表示兩個二進制位都為1,則結果為1葬馋,否則為0卖鲤。 - 否運算(not):符號為
~
,表示將一個二進制位變成相反值畴嘶。 - 異或運算(xor):符號為
?
蛋逾,表示兩個二進制位中有且僅有一個為1時,結果為1窗悯,否則為0区匣。 - 左移運算(left shift):符號為
<<
- 右移運算(right shift):符號為
>>
- 帶符號位的右移運算(zero filled right shift):符號為
>>>
其它
小括號
在JavaScript中,圓括號是一種運算符蒋院,它有兩種用法:如果把表達式放在圓括號之中亏钩,作用是求值;如果跟在函數的后面欺旧,作用是調用函數姑丑。
把表達式放在圓括號之中,將返回表達式的值辞友。
void
void運算符的作用是執(zhí)行一個表達式彻坛,然后返回undefined。
逗號運算符
逗號運算符用于對兩個表達式求值踏枣,并返回后一個表達式的值昌屉。
運算符優(yōu)先級與結合性
優(yōu)先級什么意思大家都清楚,結合性是指多個具有同樣優(yōu)先級的運算符表達式中的運算順序茵瀑。有的運算符是左結合的间驮,即運算從左到右執(zhí)行马昨,下面兩個運算是一樣的
w = x + y + z;
w = (x + y) + z;
有的運算符是右結合的
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權威指南》中有個表闡述的很好(我去掉了位運算部分)扛施,其中R/L代表結合性是右結合還是左結合,num->num表示操作符期望的數據類型和計算結果類型疙渣,lval指左值
運算符 | 操作 | 結合性 | 類型 |
---|---|---|---|
++ | 自增 | R | lval->num |
-- | 自減 | R | lval->num |
- | 求反 | R | num->num |
+(一個操作數) | 轉換為數字 | R | num->num |
~ | 按位求反 | R | int->int |
! | 邏輯非 | R | bool->bool |
delete | 刪除屬性 | R | lval->bool |
typeof | 檢測數據類型 | R | any->str |
void | 返回undefined | R | any->undefined |
-- | -- | -- | -- |
*、/妄荔、% | 乘、除谍肤、求余 | L | num,num->num |
-- | -- | -- | -- |
+、- | 加荒揣、減 | L | num,num->num |
+ | 字符串拼接 | L | str,str->str |
<、<=系任、>恳蹲、>= | 數字大小或字母表順序 | 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 |
, | 忽略第一個操作數举农,返回第二個操作數 | L | any,any->any |
有幾個我們需要注意的地方
- typeof的優(yōu)先級相當的高荆针,比加減乘除神馬的都高,所以雖然是操作符颁糟,在在復雜表達式的時候我們還是習慣加括號航背,看個例子
typeof 2*3; //NaN
typeof (2*3); //"number"
typeof 2+3; //"number3"
- ++、--是右結合的操作符(優(yōu)先級最高的幾個都是右結合)棱貌,而且比加減乘除優(yōu)先級高玖媚。同時自增、自減運算符的運算數得是左值(可以放在賦值符號左邊的值)婚脱,而不能是常數
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
- 賦值運算符的優(yōu)先級相當的低
a = b == c; //等同于a = (b==c)
- 邏輯非!也在優(yōu)先級隊列的前端障贸,比加減乘除高错森,但邏輯與、邏輯或優(yōu)先級很低篮洁,不如加減乘除
!2*0; //0, 等價于(!2)*0
- 一個關于邏輯運算符的有意思地方是其“短路”功能涩维,相信大家都有所了解,但有些題目不那么單純袁波,會結合表達式計算值來考察
1 && 3;
1 && "foo" || 0;
1 || "foo" && 0
了解了邏輯運算符的“短路”特點瓦阐,在知道原始表達式的“返回值”就是本身蜗侈,題目就很簡單了
相等
我們知道可以使用==
或===
判斷兩個值的相等性,其中區(qū)別相信大家清楚睡蟋,===
是嚴格意義的相等踏幻,只需注意NaN和NaN不等就行了。而使用==
的時候戳杀,javascript會幫我們做類型轉換该面,造成一些匪夷所思的結果,那么使用``==
的時候會在哪些情況下做類型轉換豺瘤,又會換成什么樣子吆倦?
- 如果兩個值類型相同听诸,則執(zhí)行嚴格相等的運算
- 如果兩個值的類型
- 不同如果一個是null坐求,一個是undefined,那么相等
- 如果一個是數字晌梨,一個是字符串桥嗤,先將字符串轉為數字,然后比較
- 如果一個值是true/false則將其轉為1/0比較
- 如果一個值是對象泛领,一個是數字或字符串敛惊,則嘗試使用valueOf和toString轉換后比較
- 其它就不相等了
null==undefined;
NaN==NaN
"1"==true