表達式(expression)是JavaScript中的一個短語,JavaScript解釋器會將其計算出一個結果。
將簡單表達式組合成復雜表達式最常用的方法就是使用運算符(operator)。運算符按照特定的運算規(guī)則對操作數(shù)進行運算,并計算出新值。
1、表達式
1.1原始表達式
原始表達式是表達式的最小單位---它們不包含其他表達式。
JavaScript中的原始表達式包含常量、直接量、變量或關鍵字。
直接量是直接在程序中出現(xiàn)的常數(shù)值。
1.2
"hello"
保留字
true
flase
null
this
變量
i
num
1.2對象和數(shù)組的初始化表達式
對象和數(shù)組初始化表達式實際上是一個新創(chuàng)建的對象和數(shù)組。也可稱為“對象直接量”和“數(shù)組直接量”。
var arr = []
var p = {};
注意:JavaScript對數(shù)組初始化表達式和對象初始化表達式求值的時候,數(shù)組初始化表達式和對象初始化表達式的元素表達式也都會各自計算一次。也就是說,元素表達式每次計算的值有可能是不同的。
1.3函數(shù)定義表達式
函數(shù)定義表達式(函數(shù)直接量)定義一個JavaScript函數(shù)。表達式的值是這個新定義的函數(shù)。
var f = function(){}
1.4屬性訪問表達式屬性訪問表達式運算得到一個對象屬性或一個數(shù)組元素的值。
var arr =[1];
var p = {x:1}
arr[0]
p.x
注意:在“.”和“[”之前的表達式總是會首先計算,如果計算結果是null或undefined,表達式會拋出一個類型錯誤異常,因為這兩個值都不能包含任何屬性。
1.5調(diào)用表達式
JavaScript中的調(diào)用表達式是一種調(diào)用函數(shù)或方法的語法表示。
f()
a.sort()
1.6對象創(chuàng)建表達式對象創(chuàng)建表達式創(chuàng)建一個對象并調(diào)用一個函數(shù)(這個函數(shù)稱做構造函數(shù))初始化新對象的屬性。
new Object()
JavaScript中的大多數(shù)運算符是一個二元運算符。不過,JavaScript支持一個三元運算符(ternary operator),條件判斷運算符“?:”,它將三個表達式合并成一個表達式。
2算術運算符
加法運算符(Addition):x + y
減法運算符(Subtraction): x - y
乘法運算符(Multiplication): x * y
除法運算符(Division):x / y
余數(shù)運算符(Remainder):x % y
自增運算符(Increment):++x 或者 x++
自減運算符(Decrement):--x 或者 x--
數(shù)值運算符(Convert to number): +x
負數(shù)值運算符(Negate):-x
2.1 加法運算符
加法運算符(+)可以對兩個數(shù)字做加法,也可以做字符串連接操作。
1 + 2 //3
'hello' + ' world' //hello world
加法運算符的行為表現(xiàn)為:
- 如果其中一個操作數(shù)是對象,則對象會遵循對象到原始值的轉換規(guī)則轉為為原始類值;日期對象通過toString()方法執(zhí)行轉換,其他對象則通過valueOf()方法執(zhí)行轉換,如果結果還不是原始類型的值,再執(zhí)行toString方法;
- 在進行了對象到原始值的轉換后,如果其中一個操作數(shù)是字符串的話,另一個操作數(shù)也會轉換字符串,然后進行字符串連接。
- 否則,兩個操作數(shù)都將轉換為數(shù)字(或者NaN),然后進行加法操作。
2.2一元算術運算符
一元算術運算符作用于一個單獨的操作數(shù),并產(chǎn)生一個新增。
在JavaScript中,一元算術運算符具有很高的優(yōu)先級,而且都是右結合。
(1)一元加法(+)
一元加法運算符把操作數(shù)轉換為數(shù)字(或者NaN),并返回這個轉換后的數(shù)字。如果操作數(shù)本身就是數(shù)字,則直接返回這個數(shù)字。
(2)一元減法(-)
當“-"用做一元運算符時,它會根據(jù)需要把操作數(shù)轉換為數(shù)字,然后改變運算結果的符號。
(3)遞增(++)
遞增“++”運算符對操作數(shù)進行增量(加-)操作。運算符將操作數(shù)轉換為數(shù)字,然后給數(shù)字加1,并將加1后的數(shù)值重新賦值給變量、數(shù)組元素或對象屬性。
前增量
運算符在操作數(shù)之前。
運算符在操作數(shù)之后。
后增量會先返回變量操作前的值,再進行自增操作;前增量會先進行自增操作,再返回變量操作后的值。
var a = 1;
a++; // 1
++a; // 2
注意:由于JavaScript會自動進行分號補全,因此不能再后增量運算符和操作數(shù)直接插入換行符。
遞減(--)
遞減運算符和”++“運算符一樣,返回值也依賴于它相對操作數(shù)的位置。
var a = 3;
a--; //3
--a; //2
3、關系運算符、邏輯運算符、賦值運算符、位運算符
3.1關系表達式
關系運算符用于測試兩個值之間的關系,根據(jù)關系是否存在而返回true或false。
== 相等
=== 嚴格相等
!= 不相等
!== 嚴格不相等
< 小于
<= 小于或等于
> 大于
>= 大于或等于
相等和不等運算符"=="和"==="運算符用于比較兩個值是否相等。
"!="和"!=="運算符的檢測規(guī)則是"=="和"==="運算符的求反。
比較運算符
小于(<)
大于(>)
小于等于(<=)
大于等于(>=)
3.2邏輯表達式邏輯運算符是對操作數(shù)進行布爾算術運算,經(jīng)常和關系運算符一起配合使用。
邏輯與(&&)
且運算符的運算規(guī)則是:如果第一個運算子的布爾值為true,則返回第二個運算子的值(注意是值,不是布爾值);如果第一個運算子的布爾值為false,則直接返回第一個運算子的值,且不再對第二個運算子求值。
true && 1; //1
'' && 'f' //""
邏輯或(||)
或運算符(||)的運算規(guī)則是:如果第一個運算子的布爾值為true,則返回第一個運算子的值,且不再對第二個運算子求值;如果第一個運算子的布爾值為false,則返回第二個運算子的值。
'a' || '' // "a"
'' || 'a' //"a"
邏輯非(!)
取反運算符形式上是一個感嘆號,用于將布爾值變?yōu)橄喾粗?,即true變成false,false變成true。
!true; //false
!false; //true
對于非布爾值的數(shù)據(jù),取反運算符會自動將其轉為布爾值。規(guī)則是,以下六個值取反后為true,其他值取反后都為false。
undefined
null
false
0(包括+0和-0)
NaN
空字符串('')
3.3.賦值表達式JavaScript使用“=”運算符來給變量或熟悉賦值。
帶操作的賦值運算
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
3.4位運算符
位運算符用于直接對二進制進行計算。
或運算(or):符號為|,表示若兩個二進制位都為0,則結果為0,否則為1。
與運算(and):符號為&,表示若兩個二進制位都為1,則結果為1,否則為0。
否運算(not):符號為~,表示對一個二進制位取反。
異或運算(xor):符號為^,表示若兩個二進制位不相同,則結果為1,否則為0。
左移運算(left shift):符號為<<。
右移運算(right shift):符號為>>。
帶符號位的右移運算(zero filled right shift):符號為>>>
有一點需要特別注意,位運算符只對整數(shù)起作用,如果一個運算子不是整數(shù),會自動轉為整數(shù)后再執(zhí)行。
4、其他運算符
4.1in運算符
in運算符希望它的左操作數(shù)是一個字符串或可以轉換為字符串,希望它的右操作數(shù)是一個對象。如果右側的對象擁有一個名為左操作數(shù)值的屬性名,則返回true。
var o = {x:1};
"x" in o //true
4.2instanceof運算符
instanceof運算符希望左操作數(shù)是一個對象,右操作數(shù)標識對象的類。如果左側的對象是右側類的實例,則表達式返回true。
var a = new Array();
a instanceof Object; //true
注意:所有對象都是Object的實例。
4.3條件運算符(?:)
三元條件運算符用問號(?)和冒號(:),分隔三個表達式。如果第一個表達式的布爾值為true,則返回第二個表達式的值,否則返回第三個表達式的值。
x>0 ? x : -x; //求x的絕對值
4.4typeof運算符typeof是一元運算符,用來判斷類型。
typeof 1 // 'number'
4.5delete 運算符delete是一元操作符,它用來刪除對象的屬性或數(shù)組元素。
var o={x:1}
delete o.x;
"x" in o //false
4.6void運算符void是一元運算符,它出現(xiàn)在操作數(shù)之前,操作數(shù)可以是任意類型。操作數(shù)會照常計算,但忽略計算結果并返回undefined。
void 0 //undefined
void(0) //undefined
var a = 1;
void (a=2);
a //2
這個運算符主要是用于書簽工具(bookmarklet),以及用于在超級鏈接中插入代碼,目的是返回undefined可以防止網(wǎng)頁跳轉。
<a href="javascript:void(0)"></a>
4.8逗號運算符(,)逗號運算符是二元運算符,它的操作數(shù)可以是任意類型。它首先計算左操作數(shù),然后計算右操作數(shù),最后返回右操作數(shù)的值。
'a','b' //"b"
var a = 0;
var b = (a++,5);
a //1
b //5
5、運算順序
5.1優(yōu)先級
JavaScript各種運算符的優(yōu)先級別(Operator Precedence)是不一樣的。優(yōu)先級高的運算符先執(zhí)行,優(yōu)先級低的運算符后執(zhí)行。
5.2圓括號
圓括號(())可以用來提高運算的優(yōu)先級,因為它的優(yōu)先級是最高的,即圓括號中的表達式會第一個運算。
注意:因為圓括號不是運算符,所以不具有求值作用,只改變運算的優(yōu)先級。
對于優(yōu)先級別相同的運算符,大多數(shù)情況,計算順序總是從左到右,這叫做運算符的“左結合”(left-to-right associativity),即從左邊開始計算。
但是少數(shù)運算符的計算順序是從右到左,即從右邊開始計算,這叫做運算符的“右結合”(right-to-left associativity)。其中,最主要的是賦值運算符(=)和三元條件運算符(?:)。
更多建議: