操作符1.一元操作符 只能操作一個值的操作符叫做一元操作符,一元操作符有遞增(遞減)操作符以及一元加(減)操作符。 遞增遞減操作符分為前置遞增(遞減)操作符和後置遞增(遞減)操作符,不管是前置還是後置的遞增(遞減)操作符,其使用方式與java中的遞增遞減操作符一樣,有區別的地方就是javascr.....
操作符
1.一元操作符
只能操作一個值的操作符叫做一元操作符,一元操作符有遞增(遞減)操作符以及一元加(減)操作符。
遞增遞減操作符分為前置遞增(遞減)操作符和後置遞增(遞減)操作符,不管是前置還是後置的遞增(遞減)操作符,其使用方式與java中的遞增遞減操作符一樣,有區別的地方就是javascript中的遞增遞減操作符可以對非數字類型的值進行操作,看下麵的例子:
a.對包含有效數字字元的字元串執行遞增遞減操作時,會將字元串轉換成數字後再執行遞增遞減操作。字元串最後轉換為number類型。
b.對於不能轉換成數字的字元串,返回NaN,且原字元串變為NaN。
c.對於布爾型值,true轉換為1,false轉換為0後執行遞增遞減操作。
d.對象類型,先執行對象的valueOf()方法,對取出的值執行上述的方式進行遞增遞減,如果返回NaN,那麼再執行toString()方法,同樣採用上述的方式進行遞增遞減。
前置遞增遞減操作符,變數的值都是在語句被求值以前改變;後置遞增遞減操作符,變數的值都是在語句被求值以後改變。
對於一元加或者減操作符,一元加操作符以(+)表示,一元減操作符以(-)表示。對於數字使用一元加或者減操作符與數學中的加減操作符一樣,但是在對非數字值使用一元加減操作符時,相當於對當前值使用Number()函數。具體的操作如下所示:
2.位操作符
位操作符實際上是操作記憶體中表示數值的位來操作數值。ECMAScript中的所有數值都是以IEEE-754 64位格式存儲,但是位操作符並不是直接操作64位的值,而是先把64位值轉換為32位,然後執行操作,將操作結果再轉換回64位。
對於有負號的整數,32位中的前31位存儲數值,32位是符號位,1表示負數,0表示正數。其中正數以純二進位的格式存儲,31位中的每一位都是2的指數次冪,2的指數從0開始,一直向後類推。沒有用到的位以0填充。負數同樣用二進位存儲,但是使用的格式是二進位補碼(計算方式請自行百度)。在ECMAScript中負數的二進位表示形式是該負數的絕對值的二進位前面加上負號,例如18的二進位碼是10010,那麼-18的二進位碼就是-10010。
ECMAScript中對數值應用位操作符時,首先64位的數值會被轉換成32位,然後執行位操作,操作完成之後將32位的結果再轉換回64位。其中NaN和Infinit應用位操作符時,會當做0處理。對於非數字型值,自動使用Number()函數轉換成數值後再進行位操作,得到一個數字結果。
2.1按位非
使用波浪線(~)表示,按位非操作符返回數值的反碼,如下例子所示:
可以看到對25執行按位非操作之後,結果返回-26,-26的二進位碼是26的二進位碼前面加上負號,本來應該是二進位補碼,但是在ECMAScript中顯示的就是整數的二進位碼的負值。同時上述例子可以看出按位非操作符等價於當前值的負值減一。
2.2.按位與|按位或|按位異或
按位與操作符用(&)表示,該操作符對兩個操作數進行操作,按照下表中的規則依次比較兩個數值對應位置的值,返回一個數值。比較規則如下(兩個數值的相同位置上的值都為1結果為1,其他的結果都是0):
第一個數值的位 |
第二個數值的位 |
比較結果 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
例子如下:
按位或操作符使用(|)表示,同樣是對兩個操作數操作,對比規則如下所示(兩個數值的相同位置上的值只要有一個為1,結果就是1):
第一個數值的位 |
第二個數值的位 |
比較結果 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
例子如下:
按位異或使用(^)表示,操作兩個操作數,比較規則(兩個數值相同位置上的值相同,結果是0,不同結果是1):
第一個數值的位 |
第二個數值的位 |
比較結果 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
例子如下:
2.3.左移
左移使用(<<)表示。如下所示:
通過上面的例子可以看出,左移操作符將數值的所在位向左移動指定的位數,也就是向左了5位,移動後原數值的右側空出五個位置,用0來補充空位。註意:左移操作符不會影響操作數的符號位,也就是說-11向左移動5位結果是-352。
2.4.有符號的右移|無符號右移
有符號的右移用(>>)表示,先看例子:
有符號的右移會將數值向右移動指定的位數,但是保留符號位,也就是說有符號的右移是不會造成數值符號改變的,右移造成的空位用符號位的值來填充,以得到一個完整的值。
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
右移5位之後,結果為4,二進位碼如下所示:
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
無符號的右移用(>>>)表示,這個操作符會把數值的所有32位都向右移動,對於正數來說,無符號右移和有符號右移得到的結果是一樣。但是對於負數來說,結果卻是會發生改變,原因主要有兩點:第一,無符號右移是以0來填充空位,有符號右移是以符號位的值來填充空位;第二,無符號的右移會把負數的二進位碼當成正數的二進位碼,而且,由於負數的二進位碼以其絕對值的二進位碼補碼形式存在,因此就會導致無符號右移後的結果非常大。
例子如下所示:
如上所示,-64的二進位碼為64的二進位碼補碼,也即1111111111111111111111111000000,
無符號右移操作會把這個值當做正數的二進位碼,然後再右移5位形成00000111111111111111111111111110,轉換為十進位數字就是134217726。
3.布爾操作符
3.1.邏輯非
邏輯非操作符用(!)表示,可以對ECMAScript中的任何值使用該操作符,返回一個布爾值,對值使用該操作符時,會先將當前值轉換為布爾值,然後再對其取反。具體的轉換規則如下:
i.操作數是對象,返回false;
ii.操作數是空字元串,返回true;
iii.操作數是非空字元串,返回false;
iv.操作符是數值0,返回true;
vi.操作數是非0數值(包括Infinity),返回false;
vii.操作數是null,返回true;
viii.操作數是NaN,返回true;
ix.操作數是undefined,返回true;
3.2.邏輯與
邏輯與操作符使用(&&)符號表示,與java中一樣,必須兩個操作數都是true時,結果才為true,如果有一邊為false,那麼結果就是false。但是javascript中,兩個操作數的數據類型不一定都是布爾型的,也可以是其他的數據類型,此時返回結果的判斷規則如下所示:
i.如果第一個操作數是對象,那麼返回第二個操作數;
ii.如果第二個操作數是對象,那麼只有在第一個操作數返回true時才會返回該對象;
iii.如果兩個操作數都是對象,那麼返回第二個操作數;
iv.如果一個操作數是null,那麼返回null;
v.如果一個操作數是NaN,那麼返回NaN;
vi.如果一個操作數是undefined,那麼返回undefined;
註意:邏輯與操作屬於短路操作,只要第一個操作數能夠確定結果,第二個操作數就不會再求值。切兩個操作數中不能出現未聲明的變數,否則會導致錯誤。
3.3.邏輯或
邏輯或操作符用(||)表示,即兩個操作數中有一個為true,那麼結果就是true。同樣,兩個操作數中如果有一個不是布爾值,邏輯或也不一定返回布爾值,具體規則如下:
i.如果第一個操作數是對象,那麼返回對象;
ii.如果第一個操作數的求值結果是false,那麼返回第二個操作數;
iii.如果兩個操作數都是對象,那麼返回第一個操作數;
iv.如果兩個操作數都是null,那麼返回null;
v. 如果兩個操作數都是NaN,那麼返回NaN;
vi. 如果兩個操作數都是undefined,那麼返回undefined;
4.乘性操作符
ECMAScript中規定了三種乘性操作符,分別是乘法、除法和求模,這三種操作符與java中的操作一樣,不同的是當操作符不是數值的時候,會執行自動的類型轉換。
4.1.乘法
乘法操作符用(*)表示,用語計算兩個數值的乘積,當操作數為特殊情況時,處理規則如下:
i.如果兩個操作數都是數值,按照數學的乘法計算即可,但是當計算結果超過ECMAScript規定的數值範圍時,返回Infinity或者-Infinity;
ii.如果有一個操作數是NaN,那麼返回NaN;
iii.如果是Infinity與0相乘,結果是NaN;
iv.如果Infinity與非零數值相乘,結果是Infinity或者-Infinity,符號取決於非零數值;
v.如果是Infinity與Infinity相乘,結果還是Infinity;
vi.如果有一個操作數不是數值,那麼調用Number()函數轉換為數值之後,再執行上述操作。
4.2. 除法
除法操作符用(/)表示,表明第二個操作數除第一個操作數的計算,同樣,特殊情況處理規則如下:
i.如果兩個操作數都是數值,那麼執行數學計算即可,如果商超過ECMAScript規定的數值範圍,那麼返回Infinity或者-Infinity。
ii.如果有一個操作數是NaN,那麼返回NaN;
iii.如果是Infinity被Infinity除,結果是NaN;
iv.如果是0除以0,結果是NaN;
v.如果非零的有限數被0除,那麼返回Infinity或者-Infinity,符號取決於被除數;
vi.如果是Infinity被任何非零有限數除,那麼返回結果是Infinity或者-Infinity。
vii. 如果有一個操作數不是數值,那麼調用Number()函數轉換為數值之後,再執行上述操作。
4.3.求模
求模操作符由(%)表示,表示第一個操作數除以第二個操作數所得的餘數,處理規則如下:
i.如果兩個操作數都是數值,執行數學運算即可;
ii.如果被除數無限大,除數有限大,那麼返回NaN;
iii. 如果被除數無限大,除數是0,那麼返回NaN;
iv.如果是Infinity除以Infinity,結果是NaN;
v.如果被除數是有限大的數值,除數是無限大的數值,返回被除數;
vi.如果被除數是0,結果是0;
vii. 如果有一個操作數不是數值,那麼調用Number()函數轉換為數值之後,再執行上述操作。
5.加性操作符
5.1.加法
加法操作符使用(+)表示,如果兩個操作數都是數值,執行常規的加法運算,根據以下規則計算結果:
i.如果有一個數是NaN,那麼結果就是NaN;
ii.如果是Infinity加Infinity,結果是Infinity;
iii.如果是-Infinity加-Infinity,結果是-Infinity;
iv.如果是Infinity加-Infinity,結果是NaN;
v.如果是+0加-0,結果是+0;
vi.如果是+0加+0,結果是+0;
vii.如果是-0加-0,結果是-0;
如果有一個操作符是字元串,那麼久需要使用以下規則:
- 如果兩個操作數都是字元串,那麼把兩個字元串拼接起來;
- 如果只有一個操作數是字元串,那麼將另一個操作數轉換成字元串,然後把兩者拼接起來;
如果有一個操作數是對象、數值或者布爾值, 則調用他們的toString()方法取到相應的字元串,再應用前面關於字元串的規則,如果是undefined或者null,調用String()函數獲取到對應的字元串”undefined”和”null”;
5.2.減法
減法操作符使用(-)表示,具體的運算規則如下所示:
i.如果兩個操作符都是數值,那麼數學運算即可;
ii.如果一個操作數是NaN,結果是NaN;
iii. 如果是Infinity減Infinity,結果是NaN;
iv. 如果是-Infinity減-Infinity,結果是NaN;
v. 如果是Infinity減-Infinity,結果是Infinity;
vi. 如果是-Infinity減Infinity,結果是-Infinity;
vii. 如果是+0減+0,結果是+0;
viii. 如果是+0減-0,結果是-0;
ix. 如果是-0減-0,結果是+0;
x.如果一個操作數是字元串、布爾值、null或者undefined,那麼調用Number()函數轉換為數值後再根據前面的規則執行減法計算;
xi.如果有一個操作數是對象,那麼調用對象的valueOf()方法取得表示該對象的值,如果得到的值是NaN,減法的結果就是NaN,如果對象沒有valueOf()方法,那麼就調用toString()方法並將取到的字元串轉換為數字。
6.關係操作符
ECMAScript中使用<,>,<=,>=這幾個關係操作符比較兩個值的大小,具體的比較規則如下:
i.如果兩個操作數都是數值,那麼進行數學運算即可;
ii.如果兩個操作數都是字元串,那麼比較兩個字元串對應的字元編碼值;
iii.如果一個操作數是數值,則將另一個操作數轉換為一個數值,然後執行數值比較;
iv.如果一個操作數是對象,先調用該對象的valueOf()方法,用得到的值按照前面的規則比較,如果對象沒有valueOf()方法,那麼就調用對象的toString()方法,用得到的值按照前面的規則比較。
v.如果一個操作數是布爾值,先將其裝換為數值後再進行比較。
下麵看兩個例子:
這個例子中小寫字母a分別和小寫字母b以及大寫字母B比較,發現a小於b但是大於B,這是由於兩個字元串比較,實際上是比較兩個字元串中對應位置的每個字元的字元編碼值,大寫字母的字元編碼值全部小於小寫字母的字元編碼值,因此a<B返回false。
第二個例子:
這個例子中,首先是字元串”23”和字元串”3”比較,比較的結果是”23”小於”3”,原因和上一個例子一樣,兩個字元串比較的是字元編碼,”23”的字元編碼是50,而”3”的字元編碼是51,因此返回結果為true。對於字元串”23”和數字3比較,由於一個操作數是數字,因此會將字元串轉換為數字後比較,因此返回false。
7.相等操作符
相等操作符分為兩種類型,第一種是相等和不相等,當需要轉換時,先轉換再進行比較;第二種是全等和不全等,此時不進行轉換,直接進行比較。
7.1.相等和不相等
相等操作符用(==)表示,不相等操作符用(!=)表示,這兩個操作符都會對操作數進行強制轉型,然後才比較兩者的相等與否。
在強制轉型時,相等和不相等操作符遵循以下規則:
i.如果有一個操作數是布爾值,那麼先將其轉換為數字,false為0,true為1;
ii.如果一個操作數是字元串,另一個操作數是數字,那麼需要先將字元串轉換為數字後再比較;
iii.如果一個操作符時對象,另一個不是,那麼需要調用對象的valueOf()方法,用得到的基本類型值按照前面的規則比較;
iv.null和undefined是相等的;
v.在比較之前,不能將null或者undefined轉換成其他的值;
vi.如果有一個操作數是NaN,那麼相等操作符返回false,不相等操作符返回true,如果兩個操作數都是NaN,相等操作符返回false;
vii.如果兩個操作數都是對象,那麼則比較兩個操作符指向的是否是同一個對象,如果是,那麼相等操作符返回true,否則返回false;
7.2.全等和不全等
全等和不全等與相等和不相等之間唯一的區別就是在比較之前不進行操作數轉換,全等操作符用(===)表示,當兩個操作數不需要經過轉換就相等時返回true,不全等用(!==)表示。
註意:null == undefined返回true是由於兩者是類似的值,但是null === undefined返回false是由於兩者不是一個類型,推薦使用全等和不全等操作符。
8.條件操作符、賦值操作符、逗號操作符
8.1.條件操作符
條件操作符就是我們所屬的三元比較,表示方式為:boolean_condition ? true_value : false_value。當條件為true時,返回true_value,當條件為false時,返回false_value。
8.2.賦值操作符
賦值操作符的作用就是把操作符右側的值賦給左側的變數,最簡單的賦值操作符就是=,其他的操作符有*=,/=,%=,+=,-=,<<=(左移賦值),>>=(有符號右移賦值),>>>=(無符號右移賦值)
8.3逗號操作符
使用逗號操作符可以在一條語句中執行多個操作,如下所示:
var num1 = 1 , num2 = 2 , num3 = 3;
操作符部分終於結束了,好累啊。